我有一个元组中的键值对列表,并且已知这些元组中的一个(并且只有一个)将包含不同的值。钥匙都是不同的。例如,
pairs = [
('John', 101991),
('Bob', 101991),
('Tom', 101997),
('Larry', 101991),
('Howard', 101991)
]
我需要用不同的值来识别元组的键。目前尚不清楚这个值是大于还是小于其他值。
我该如何做到这一点?
答案 0 :(得分:2)
您可以使用itertools.groupby
:
import itertools
pairs = [
('John', 101991),
('Bob', 101991),
('Tom', 101997),
('Larry', 101991),
('Howard', 101991)
]
new_pairs = [(a, list(b)) for a, b in itertools.groupby(sorted(pairs, key=lambda x:x[-1]), key=lambda x:x[-1])]
new_val = [a for a, b in new_pairs if len(b) == 1]
输出:
[101997]
编辑:使用词典的更有效的解决方案:
from collections import defaultdict
d = defaultdict(list)
for a, b in pairs:
d[b].append(a)
new_val = [a for a, b in d.items() if len(b) == 1]
答案 1 :(得分:1)
或者
pairs = [
('John', 101991),
('Bob', 101991),
('Tom', 101997),
('Larry', 101991),
('Howard', 101991)
]
stat = {}
for k, v in pairs:
if not v in stat: stat[v] = []
stat[v].append((k, v))
for v in stat:
if len(stat[v]) == 1:
print(stat[v][0][0]) #prints the key 'Tom'
答案 2 :(得分:1)
我只需通过解压缩来选择一个键列表和一个值列表:
keys, vals = zip(*pairs)
然后我用numpy计算每个唯一值的数量:
unique, counts = np.unique(vals, return_counts=True)
您想要的值是计数最小的值:
myminval = unique[np.argmin(counts)]
然后您在密钥列表中找到此值:
keys[vals.index(myminval)]