291

私はこのネストされたリストを持っています:

l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]

今、私がやりたいことは、リスト内の各要素を float に変換することです。私の解決策はこれです:

newList = []
for x in l:
  for y in x:
    newList.append(float(y))

しかし、ネストされたリスト内包表記を使用してこれを行うことはできますか?

私がやったことは次のとおりです。

[float(y) for y in x for x in l]

しかし、結果は 2400 の合計で 100 の束になります。

どんな解決策でも、説明をいただければ幸いです。ありがとう!

4

13 に答える 13

405

ネストされたリスト内包表記でこれを行う方法は次のとおりです。

[[float(y) for y in x] for x in l]

これにより、文字列の代わりにフロートを使用することを除いて、最初に作成したものと同様のリストのリストが得られます。1 つのフラット リストが必要な場合は、 を使用します[float(y) for x in l for y in x]

于 2013-08-06T06:05:23.283 に答える
296

ネストされた for ループをネストされたリスト内包表記に変換する方法は次のとおりです。

ここに画像の説明を入力

ネストされたリスト内包表記がどのように機能するかは次のとおりです。

            l a b c d e f
            ↓ ↓ ↓ ↓ ↓ ↓ ↓
In [1]: l = [ [ [ [ [ [ 1 ] ] ] ] ] ]
In [2]: for a in l:
   ...:     for b in a:
   ...:         for c in b:
   ...:             for d in c:
   ...:                 for e in d:
   ...:                     for f in e:
   ...:                         print(float(f))
   ...:                         
1.0

In [3]: [float(f)
         for a in l
   ...:     for b in a
   ...:         for c in b
   ...:             for d in c
   ...:                 for e in d
   ...:                     for f in e]
Out[3]: [1.0]

あなたの場合、それはこのようなものになります。

In [4]: new_list = [float(y) for x in l for y in x]
于 2017-07-13T11:27:35.547 に答える
55
>>> l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
>>> new_list = [float(x) for xs in l for x in xs]
>>> new_list
[40.0, 20.0, 10.0, 30.0, 20.0, 20.0, 20.0, 20.0, 20.0, 30.0, 20.0, 30.0, 20.0, 30.0, 50.0, 10.0, 30.0, 20.0, 20.0, 20.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0]
于 2013-08-06T06:04:58.530 に答える
3

ネストされたリスト内包表記が気に入らない場合は、map関数も利用できます。

>>> from pprint import pprint

>>> l = l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']] 

>>> pprint(l)
[['40', '20', '10', '30'],
['20', '20', '20', '20', '20', '30', '20'],
['30', '20', '30', '50', '10', '30', '20', '20', '20'],
['100', '100'],
['100', '100', '100', '100', '100'],
['100', '100', '100', '100']]

>>> float_l = [map(float, nested_list) for nested_list in l]

>>> pprint(float_l)
[[40.0, 20.0, 10.0, 30.0],
[20.0, 20.0, 20.0, 20.0, 20.0, 30.0, 20.0],
[30.0, 20.0, 30.0, 50.0, 10.0, 30.0, 20.0, 20.0, 20.0],
[100.0, 100.0],
[100.0, 100.0, 100.0, 100.0, 100.0],
[100.0, 100.0, 100.0, 100.0]]
于 2015-11-27T05:55:52.963 に答える
2

はい、次のようなコードで実行できます。

l = [[float(y) for y in x] for x in l]
于 2013-08-06T06:06:17.537 に答える
0

私の意見では、これを行う最善の方法は、python のitertoolsパッケージを使用することです。

>>>import itertools
>>>l1 = [1,2,3]
>>>l2 = [10,20,30]
>>>[l*2 for l in itertools.chain(*[l1,l2])]
[2, 4, 6, 20, 40, 60]
于 2016-07-12T10:46:44.410 に答える
0

はい、次のことができます。

[[float(y) for y in x] for x in l]
于 2018-09-06T21:46:14.753 に答える