我有一个名为wordlist的单词列表列表如下:
[['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'], ['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']]
我想在所有子列表中找到共同元素。因此,我希望输出的上述列表应为:
['cat', 'sheep']
为了实现这一目标,我使用以下代码创建了集:
sets = set(tuple(row) for row in wordlist)
这个集合看起来像这样:
{('cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new'), ('dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time')}
每个列表可以有任意数量的单词,并且可以有任意数量的列表。所以我最终会得到任何数字的不均匀集。我知道我可以使用交集方法比较两个集合,但是如何比较多个集合以仅返回常见项目?
答案 0 :(得分:13)
您错误地使用了set
。您可以使用它:
my_list = [['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'], ['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']]
# convert list of list to list of sets
my_sets = map(set, my_list)
# perform intersection on each set present in list
common_items = set.intersection(*my_sets)
这可以写成一行:
common_items = set.intersection(*map(set, my_list))
common_items
保留的值为:
{'sheep', 'cat'}
以下解决方案使用略微效率高效的方法:
给出了相同的结果# v no need to type-cast sub-lists to `set` here
set(my_list[0]).intersection(*my_list[1:])
# OR,
# set(my_list[0]).intersection(*my_list)
# as intersection of set with itself returns the same set
由于set.intersection
接受所有迭代,因此无需对所有子列表进行类型转换以进行设置。
答案 1 :(得分:1)
最简单的方法是使用map()将输入转换为集合,然后使用set.intersection查找它们的共性:
>>> data = [['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'],
['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']]
>>> set.intersection(*map(set, data))
{'sheep', 'cat'}
答案 2 :(得分:0)
尝试这种方式以获得共同的元素:
wordlist ={('cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new'), ('dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time')}</i>
for word in wordlist:
for cm in word:
if(cm in cm):
print(cm)