[英]searching through a nested-list in python
我有一個97510個值的元組的嵌套列表,如下所示:
a = [ (1,2,3), (3,4,5), (5,4,2)]
每個第一個值(index = 0)是唯一的,我需要找到其他index = 0項,它們具有相同的index = 1項。在示例中,我需要找到第二個和第三個元組,其中第二個項“ 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)]
如果要選擇特定第二個值的所有匹配項,請執行以下操作:
>>> 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
這是一種實現方法:
>>> 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)]})
這將導致一個列表字典,其中所有具有相同第二個值的所有項目都在一個列表中,並且該值作為鍵。
請注意,您還可以使用groupby :
from itertools import groupby
data = [ (1,2,3), (3,4,5), (5,4,2)]
res = groupby(sorted(data), key=lambda x: x[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))
另一種選擇:
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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.