如何在带有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中重复。
我该怎么办?
谢谢
答案 0 :(得分:1)
如果我的理解正确,您可以将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']
一旦您向我们展示了预期的输出,我就可以更新此答案。
答案 1 :(得分:1)
@timgb答案的一个小变化是例如将sum与Counter结合使用:
#include< iostream >
using namespace::std;
int foo(); //function with no argument
int foo(int=10); //Default argument
int foo()
{
cout<<"\n Foo , I am foo \n";
return 0;
}
int foo(int f)
{
cout<<"\n I am Foo too.\n";
return 0;
}
int main()
{
foo();
foo(2);
cin.get();
return 0;
}
输出
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']
与sum
一起使用,因为Counter
实现了Counter
方法,只需要向__add__
提供默认值,在这种情况下,空柜台。一旦有了计数,就可以使用生成器表达式获得计数大于一的元素。
注意
在这种情况下,这些代码输出重复的元素和包含重复元素的键sum
答案 2 :(得分:0)
将嵌套列表平整为一个列表,使用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)])