在元组列表中查找单个唯一值

时间:2017-12-08 21:17:27

标签: python

我有一个元组中的键值对列表,并且已知这些元组中的一个(并且只有一个)将包含不同的值。钥匙都是不同的。例如,

pairs = [
         ('John', 101991),
         ('Bob', 101991),
         ('Tom', 101997),
         ('Larry', 101991),
         ('Howard', 101991)
         ]

我需要用不同的值来识别元组的键。目前尚不清楚这个值是大于还是小于其他值。

我该如何做到这一点?

3 个答案:

答案 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)]