次のような97510値のタプルのネストされたリストがあります。
a = [ (1,2,3), (3,4,5), (5,4,2)]
すべての最初の値(index = 0)は一意であり、同じindex=1アイテムを持つ他のindex=0アイテムを見つける必要がありますこの例では、2番目のアイテム「4」が一般 。
どうすればいいのですか ?
次のような97510値のタプルのネストされたリストがあります。
a = [ (1,2,3), (3,4,5), (5,4,2)]
すべての最初の値(index = 0)は一意であり、同じindex=1アイテムを持つ他のindex=0アイテムを見つける必要がありますこの例では、2番目のアイテム「4」が一般 。
どうすればいいのですか ?
すべての一致を検索する場合:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for inner in a:
... d[inner[1]].append(inner)
...
>>> d
defaultdict(<type 'list'>, {2: [(1, 2, 3)], 4: [(3, 4, 5), (5, 4, 2)]})
>>> d[4]
[(3, 4, 5), (5, 4, 2)]
特定の 2 番目の値のすべての一致を選択する場合:
>>> filter(lambda inner: inner[1] == 4, a)
[(3, 4, 5), (5, 4, 2)]
編集:コメントで指摘されているように、そのような作業にはより効率的であるため、リスト内包表記が望ましいです。
>>> [inner for inner in a if inner[1] == 4]
[(3, 4, 5), (5, 4, 2)]
を使用timeit
すると、リストの理解が約 2.5 倍速くなります (私のマシンでは):
>>> timeit.timeit('[inner for inner in a if inner[1] == 4]', 'a=[(1,2,3), (3,4,5), (5, 4, 2)]')
2.5041549205780029
>>> timeit.timeit('filter(lambda inner: inner[1] == 4, a)', 'a=[(1,2,3), (3,4,5), (5, 4, 2)]')
6.328679084777832
これを行う1つの方法は次のとおりです。
>>> result = defaultdict(list)
>>> for item in a:
>>> result[item[1]].append(item)
>>> result
defaultdict(<type 'list'>, {2: [(1, 2, 3)], 4: [(3, 4, 5), (5, 4, 2)]})
これにより、同じ 2 番目の値を持つすべての項目が 1 つのリストに含まれ、その値がキーとなるリストの辞書が作成されます。
別の方法:
from operator import itemgetter
from itertools import groupby
a = [ (1,2,3), (3,4,5), (5,4,2)]
b = groupby(sorted(a), itemgetter(1))
for val, group in b:
print val, list(group)
# 2 [(1, 2, 3)]
# 4 [(3, 4, 5), (5, 4, 2)]
groupbyも使用できることに注意してください。
from itertools import groupby
data = [ (1,2,3), (3,4,5), (5,4,2)]
res = groupby(sorted(data), key=lambda x: x[1])
コメントに従って編集されました
問題をいじって、もう1つの解決策を見つけました-ただし、最良の解決策ではありませんが:
inputVals = [(1,2,3), (3,4,5), (5,4,2), (2,2,3), (7,3,1)]
for val in set(x[1] for x in inputVals):
print val, list(set(sval for sval in inputVals if sval[1] == val))