1

私はPython(2.x)が初めてで、複数のリストを含む辞書を反復処理する方法を理解しようとしています:

dict = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}

これらのリストの一意の値をすべて含む新しいリストを作成しようとしていますが、最初の項目 (整数) は無視しています。私が探している結果は次のようになります。

['green', 'yellow', 'black', 'blue']

これが私の多くの試みの1つです。私はかなり迷っているので、誰かが説明できれば、とても感謝しています。

newlist = []
for colors in dict.values() [1:]:
    if not colors in newlist:
        newlist.append(colors)
4

7 に答える 7

1

itertools.chaindict 値を単一のリストにフラット化してlist comprehensionから、文字列以外の値を除外し、最後setに一意の値を除外するために使用する 1 つの方法:

In [1]: from itertools import chain
In [2]: dict={'list_1':[3,'green','yellow','black'],'list_2':[2,'green','blue']}
In [3]: set([x for x in chain(*dict.values()) if isinstance(x, str)])
Out[3]: set(['blue', 'black', 'green', 'yellow'])

すべてのintではなく、リストの最初の項目のみを本当に削除したい場合は、同様に次のことができます。

In [4]: set(chain(*[x[1:] for x in dict.itervalues()]))
Out[4]: set(['blue', 'black', 'green', 'yellow'])

最終セットの最初の位置にないすべての int が必要な場合、最初の回答は失敗し、最初の位置に int が見つからない場合は 2 番目の回答が失敗するため、これらの場合に何が起こるかを述べる必要があります。

于 2013-08-14T10:08:57.410 に答える
1

使用set.union:

>>> dic = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}
>>> set().union(*(x[1:] for x in dic.itervalues()))
set(['blue', 'black', 'green', 'yellow'])

リストが必要な場合は、このセットを に渡すだけですlist()

効率的ではありませんが、試行の動作バージョン。

newlist = []
for colors in dic.values():
    lis = colors[1:]        #do slicing here
    for item in lis:
        if item not in newlist:
            newlist.append(item)
print newlist #['green', 'blue', 'yellow', 'black']
于 2013-08-14T10:05:23.067 に答える
0

他のインデックスに整数がある場合でも、これは機能します。

>>> di = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}
>>> set(x for value in di.values() for x in value if not isinstance(x, int))
set(['blue', 'black', 'green', 'yellow'])
于 2013-08-14T10:09:12.037 に答える
-1

を作成しsetて重複を削除し、それをsorted()ビルトインで実行してリストを返します。

newlist = sorted(set(dict.values()[1:]))
于 2013-08-14T10:06:52.117 に答える