web-dev-qa-db-ja.com

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

私はこのような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でそれを達成しようとしましたが、まだまともな結果を得られませんでした。

409
elfuego1

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]
590
unwind

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

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

内部リスト内包表記([int(column) for column in row])は、list内の10進数文字列などの一連のintオブジェクトからintrowを作成します。外部リスト内包表記([... for row in T1]))は、T1内の各項目に適用される内部リスト内包表記の結果のリストを作成します。

intで変換できないオブジェクトがいずれかの行に含まれていると、コードスニペットは失敗します。非10進数ストリングを含む行を処理したい場合は、よりスマートな機能が必要です。

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

T2 = [parse_a_row_of_T1(row) for row in T1]
28
Will Harris

内包リストのみを使用したいと思います。

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

int( )を置く代わりに、float( )を置くことで、整数と一緒に小数を使うことができます。

13
weir99

私はこれまでのところ誰もが答えることに同意するでしょうが、問題はあなたがすべての整数を持っていなければそれらがクラッシュするということです。

非整数を除外したい場合は

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())

これは実際の数字だけをもたらします。直接リスト内包表記を使用しないのは、リスト内包表記が内部変数をリークするからです。

11
Christian Witts
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
9
P.Hunter

これを試して。

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に出力されます。

6

リスト内包表記を使う:

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

Python 3.5.1では、次のようなことが起こりました。

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

そして

Enter number:  4.7
4
5

ジョージ.

4
George Moraitis

この機能を見る

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:'
3
Shameem

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)
3
Eli Korvigo

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

何らかの理由でデータベースに__import__("os").unlink("importantsystemfile")のようなものがある場合は、Evalは not あなたがやりたいことです。常にあなたの入力を検証してください(他に何もなければ、もしあなたが悪い入力を持っていれば例外int()が発生します)。

1
AKX

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

rumpy.random.permutation(x)

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

0
samvoit4