7

私は自分の課題のためにハートゲームを作っていますが、リストのリスト内のすべての要素を取得する方法がわかりません:

>>>Cards = [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C],["JH"]],[["7D"]]]

そして私の頭に浮かぶのは:

for values in cards:
    for value in values:

しかし、2つのリストを持つ要素を取得したと思います。カードに 3 と 1 のリストがあるものを計算する方法は?

4

9 に答える 9

15

このような:

>>> Cards = [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],["7D"]]
>>> from compiler.ast import flatten
>>> flatten(Cards) 
['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']

nacholibre が指摘したように、このcompilerパッケージは非推奨です。これはのソースですflatten

def flatten(seq):
    l = []
    for elt in seq:
        t = type(elt)
        if t is tuple or t is list:
            for elt2 in flatten(elt):
                l.append(elt2)
        else:
            l.append(elt)
    return l
于 2013-05-24T12:23:27.417 に答える
6

少しあいまいなワンライナー:

>>> [a for c in Cards for b in c for a in b]
['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7', 'D']

a、b、c にもっとわかりやすい名前を付けたいと思うかもしれません。

于 2013-05-24T12:16:03.337 に答える
2

このソリューションは、あらゆる種類のネストされたリストまたはタプルに対して非常に堅牢です (他の反復可能な型を追加するor isinstance(...)には、以下のコードにさらに追加するだけです。

それ自体を展開する関数を再帰的に呼び出すだけです。

def unfold(lst):
    output = []
    def _unfold(i):
        if isinstance(i, list) or isinstance(i, tuple):
            [_unfold(j) for j in i]
        else:
            output.append(i)
    _unfold(lst)
    return output

print unfold(cards)
#['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']
于 2013-05-24T14:24:25.473 に答える
1

Rosetta Code からリストをFlatten すると、次のことができます。

>>> def flatten(lst):
    return sum( ([x] if not isinstance(x, list) else flatten(x)
             for x in lst), [] )

>>> Cards = [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],["7D"]]
>>> flatten(Cards)
['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']
>>> 

このソリューションは、ネストされたリストのみを平坦化します。タプルや文字列は平坦化しません。

于 2013-05-24T20:13:12.977 に答える
1
from itertools import chain, imap

l= [[["QS","5H","AS"],["2H","8H"],["7C"]],[["9H","5C"],["JH"]],[["7D"]]]

k = list(chain.from_iterable(imap(list, l)))
m = list(chain.from_iterable(imap(list, k)))

print m

出力: ['QS', '5H', 'AS', '2H', '8H', '7C', '9H', '5C', 'JH', '7D']

Itertoolsは素晴らしいです!

于 2013-05-31T11:36:29.767 に答える