【问题标题】:find repeated letters in dictionary of lists [closed]在列表字典中查找重复的字母[关闭]
【发布时间】:2018-10-27 13:49:14
【问题描述】:

如何使用 python 在列表字典中找到重复/重复的字母?我想找到相等的键和值。例如:

{'C': ['E'], 'D': [A], 'I': ['G', 'N'], 'P': ['A', 'H', 'K', 'L'], 
'S': ['T','V'], 'R': ['J', 'M', 'Q'], 'Z': ['B', 'F', 'O', 'U', 'W', 'X']}

在这种情况下,字母 A 在字典 D 和 P 中重复。

我该怎么做?

谢谢,

【问题讨论】:

  • 预期输出是什么?
  • 该错误消息与您发布的代码不匹配。没有best_test,由于append调用后的冒号,它有一个SyntaxError,它没有定义w

标签: python python-2.7 list dictionary


【解决方案1】:

@timgb 答案的一个小转折是例如将sumCounter 结合使用:

from collections import Counter

best = {'C': ['E'], 'D': ['A'], 'I': ['G', 'N'], 'P': ['A', 'H', 'K', 'L'],
        'S': ['T', 'V'], 'R': ['J', 'M', 'Q'], 'Z': ['B', 'F', 'O', 'U', 'W', 'X']}

counts = sum((Counter(v) for v in best.values()), Counter())
repeated = set(e for e, count in counts.iteritems() if count > 1)

print repeated
print [k for k, values in best.iteritems() if repeated.intersection(values)]

输出

set(['A'])
['D', 'P']

说明

您可以将sumCounter 一起使用,因为Counter 实现了__add__ 方法,只需为sum 提供默认值,在本例中为空计数器。获得计数后,您可以使用生成器表达式获取计数大于 1 的元素。

注意

这些代码输出重复的元素和包含这些重复元素的键在这种情况下['D', 'P']

【讨论】:

  • 如果best 的长度很小,那么使用sum 是可以的,但它不能很好地扩展,因为它是Shlemiel the Painter's algorithm
  • @PM2Ring 我明白了,所以使用更新可以更好地扩展?
  • 我想是的。再想一想,在这里使用sum 可能没有我最初想的那么糟糕,因为它会改变原始计数器的值,所以它与使用sum 连接列表并不完全相同。或者连接字符串,sum 拒绝这样做。
  • 非常感谢...
【解决方案2】:

如果我理解正确,您可以将collections.Counter 应用于未嵌套的best.values() 并保留多次出现的项目。

演示:

>>> from itertools import chain # for un-nesting
>>> from collections import Counter
>>> 
>>> best = {'C': ['E'], 'D': ['A'], 'I': ['G', 'N'], 'P': ['A', 'H',  'K', 'L'], 'S': ['T','V'], 'R': ['J', 'M', 'Q'], 
...:'Z': ['B', 'F', 'O', 'U', 'W', 'X']}
...:
>>> dupes = [k for k,v in Counter(chain.from_iterable(best.values())).items() if v > 1]
>>> dupes
>>> ['A']

在此演示中,取消嵌套是使用 itertools.chain.from_iterable 完成的,但您也可以编写一个简单的 for 循环,在其中 update 计数器。

>>> c = Counter()
>>> for sub in best.values():
...:    c.update(sub)
...:    
>>> dupes = [k for k,v in c.items() if v > 1]
>>> dupes
>>> ['A']

一旦你向我们展示了预期的输出,我就可以更新这个答案。

【讨论】:

  • 嗨,就是这样...谢谢...
【解决方案3】:

将嵌套列表扁平化为一个,使用count 计算每个项目,然后使用max 打印其中的最大值:

from collections import Counter

best = {'C': ['E'], 'D': ['A'], 'I': ['G', 'N'], 'P': ['A', 'H',  'K', 'L'], 'S': ['T','V'], 'R': ['J', 'M', 'Q'], 'Z': ['B', 'F', 'O', 'U', 'W', 'X']}

flat_list = [item for sublist in [best[b] for b in best] for item in sublist]
print max([[flat_list.count(x),x] for x in set(flat_list)])

【讨论】:

  • 为什么不for sublist in best.itervalues()
  • 谢谢大家...
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 2019-01-15
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2021-11-17
相关资源
最近更新 更多