Pythonで文字列を整数に変換する方法は?


438

次のようなMySQLクエリからのタプルのタプルがあります。

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

すべての文字列要素を整数に変換して、リストのリストに戻したいのですが。

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

私はそれを達成しようとしましたがeval、まだまともな結果は得られませんでした。


2
おそらく別のデータベースアダプターモジュールを検討しますか?私は、PostgreSQLアダプターモジュールがT2セットのような結果を返すことを知っています。
kquinn 2009年


注意:マップを使用すると、Python 3および3.5のマップオブジェクトのリストが表示されます。これは、前述のPython 3.5の場合に行われます。new_list = list(list(int(a)for a in b)for b in T1 if a.isdigit())
ゲスト

ネストされていないリストに対する同様の質問:リスト内のすべての文字列をintに変換します
Aran-Fey

回答:


630

int()文字列を整数値に変換するPython標準の組み込み関数です。引数として数値を含む文字列を指定して呼び出すと、整数に変換された数値が返されます。

print (int("1") + 1)

上記は印刷し2ます。

リストの構造T1(リストが1つだけ含まれている)がわかっている場合は、Python 2でこれを行うことができます。

T2 = [map(int, x) for x in T1]

Python 3の場合:

T2 = [list(map(int, x)) for x in T1]

4
なんでT2 = map(lambda lol: map(int, lol), T1)?マップまたはリストの理解度、どちらもばかげています;)
空飛ぶ羊

4
@flyingsheep Doubleマップは私にはばかげているように見えますが、これは問題ないようです。
jamylak

Python 2の例を削除するのはどうですか(Python2のサポートが終了したため)?
Alisso

28

リスト内包表記でこれを行うことができます:

T2 = [[int(column) for column in row] for row in T1]

内側のリストの内包表記([int(column) for column in row])のビルドlistint一連から秒intの小数点文字列のように、-ableオブジェクトrow。外部リスト内包([... for row in T1]))は、内の各アイテムに適用された内部リスト内包の結果のリストを作成しT1ます。

によって変換できないオブジェクトが行に含まれている場合、コードスニペットは失敗しintます。10進数以外の文字列を含む行を処理する場合は、よりスマートな関数が必要になります。

行の構造がわかっている場合は、内部リストの内包を行の関数の呼び出しに置き換えることができます。例えば。

T2 = [parse_a_row_of_T1(row) for row in T1]

16

私はむしろ内包リストだけを使うことを好む:

[[int(y) for y in x] for x in T1]

12

int( )putの代わりにput float( )を使用すると、整数とともに小数を使用できます。


2
回答の詳細を説明できますか?
リコ

10

私はこれまでのところ全員の回答に同意しますが、問題は、すべての整数がないとクラッシュすることです。

非整数を除外したい場合

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())

これは実際の数字のみを生成します。直接リスト内包表記を使用しない理由は、リスト内包表記が内部変数をリークするためです。


2
isdigitトリッキーです、試してみてください-1。/でint(<str>)確認する方法です。tryexcept
totoro

9
T3=[]

for i in range(0,len(T1)):
    T3.append([])
    for j in range(0,len(T1[i])):
        b=int(T1[i][j])
        T3[i].append(b)

print T3

7
Stack Overflowへようこそ!コードのブロックを投稿するだけでなく、このコードが提起された問題を解決する理由を説明してください。説明がなければ、これは答えではありません。
Artemix

7

これを試して。

x = "1"

xは引用符で囲まれているため文字列ですが、数字が含まれています。

x = int(x)

xには数値1が含まれているため、整数に変換できます。

文字列が数値であるかどうかを確認するには、これを行うことができます。

def is_number(var):
    try:
        if var == int(var):
            return True
    except Exception:
        return False

x = "1"

y = "test"

x_test = is_number(x)

print(x_test)

xは数値なので、IDLE Trueに出力されます。

y_test = is_number(y)

print(y_test)

yは数値ではないため、IDLE Falseに出力されます。


2
is_number関数が間違っています。「1」は1と等しくありません。これはPerlではありません。:-P
Veky

3
ホイールを再発明しないでくださいx.isnumeric()
bfontaine 2017年

4

リスト内包表記の使用:

t2 = [map(int, list(l)) for l in t1]

1
Python 3では、これはマップオブジェクトのリストを返します:(
CpILL

3

Python 3.5.1では、次のようなものが機能します。

c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

そして

Enter number:  4.7
4
5

ジョージ。


3

この機能を見る

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

その後

val = parse_int('10')  # Return 10
val = parse_int('0')  # Return 0
val = parse_int('10.5')  # Return 10
val = parse_int('0.0')  # Return 0
val = parse_int('Ten')  # Return None

あなたもチェックすることができます

if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'

eval悪です:に置き換えてくださいast.literal_eval
Eli Korvigo

3

Python 2のさらに別の機能的なソリューション:

from functools import partial

map(partial(map, int), T1)

ただし、Python 3は少し乱雑になります。

list(map(list, map(partial(map, int), T1)))

これをラッパーで修正できます

def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)

1

それがタプルのタプルだけの場合、のようなものrows=[map(int, row) for row in rows]がトリックを行います。(そこには、リスト内包表記とmap(f、lst)への呼び出しがあり、これは[l(in)in a lst]の[f(a)に等しい)。

何らかの理由でデータベースに何かがある場合に備えて、Evalは実行したいことではありません__import__("os").unlink("importantsystemfile")。入力を常に検証します(他に何もない場合、入力が正しくない場合、例外int()が発生します)。


-1

あなたはこのようなことをすることができます:

T1 = (('13', '17', '18', '21', '32'),  
     ('07', '11', '13', '14', '28'),  
     ('01', '05', '06', '08', '15', '16'))  
new_list = list(list(int(a) for a in b if a.isdigit()) for b in T1)  
print(new_list)  

-1

ここではまだ言及されていないように見える利用可能なオプションを共有したいと思います。

rumpy.random.permutation(x)

配列xのランダムな順列を生成します。あなたが要求したものと正確に同じではありませんが、それは同様の質問に対する潜在的な解決策です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.