5

文字列のリストがあり、文字列の長さで文字列のリストのリストを作成しようとしています。

すなわち

['a', 'b', 'ab', 'abc'] 

になる

[['a', 'b'], ['ab'], ['abc']]

私はこれを次のように達成しました:

lst = ['a', 'b', 'ab', 'abc']
lsts = []
for num in set(len(i) for i in lst):
    lsts.append([w for w in lst if len(w) == num])

私はそのコードで問題ありませんが、理解に頭を悩ませようとしています。ネストされた内包表記を使用して同じことをしたいのですが、方法がわかりません。

4

5 に答える 5

4
>>> [[w for w in L if len(w) == num] for num in set(len(i) for i in L)]
[['a', 'b'], ['ab'], ['abc']]

また、itertoolsもう少し効率的である可能性があります。

于 2012-07-04T19:25:12.943 に答える
1
lst = ['a', 'b', 'ab', 'abc']
lst.sort(key=len) # does not make any change on this data,but
                  # all strings of given length must occur together


from itertools import groupby
lst = [list(grp) for i,grp in groupby(lst, key=len)]

結果は

[['a', 'b'], ['ab'], ['abc']]
于 2012-07-04T19:27:39.807 に答える
0
from itertools import groupby

mylist = ['a', 'b', 'ab', 'abc']
[list(vals) for key, vals in groupby(mylist, lambda L: len(L))]

groupby は隣接する要素でのみ機能するため、key=len を使用して mylist を強制的にソートする必要がある場合があります)

  • key (これは長さになります) と、そのキー グループのデータを含む別の反復子である vals を持つ反復子を返します。
  • 次に、データの反復子をリストに変換します
  • 外部リストは上記から構築されます

  • -
于 2012-07-04T19:44:43.853 に答える
0

つまり、1 から最大までのすべての長さです (リストにその長さの文字列がない場合、一部のリストは空になりaます)。

>>> a = ['a', 'b', 'ab', 'abc']
>>> m = max(len(x) for x in a)
>>> print [[x for x in a if len(x) == i + 1] for i in range(m)]
[['a', 'b'], ['ab'], ['abc']]

ただし、含まれている長さのリストのみが必要な場合は、範囲の代わりにa使用する必要があります。set(len(i) for i in lst)

>>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)]
[['a', 'b'], ['ab'], ['abc']]

リストに違いはありません['a', 'b', 'ab', 'abc']。しかし、 so: のように少し変更すると[['a', 'b'], ['ab'], ['abcd']]、違いがわかります。

>>> a = ['a', 'b', 'ab', 'abcd']
>>> print [[x for x in a if len(x) == i] for i in set(len(k) for k in a)]
[['a', 'b'], ['ab'], ['abcd']]

>>> print [[x for x in a if len(x) == i + 1] for i in range(max(len(x) for x in a))]
[['a', 'b'], ['ab'], [], ['abcd']]
于 2012-07-04T19:26:12.687 に答える
0
L=['a','b','ab','abc']
result = [ [ w for w in L if len(w) == n] for n in set(len(i) for i in L)]
于 2012-07-04T19:28:07.417 に答える