比较Python中的多个列表

比较Python中的多个列表,python,list,compare,python-3.3,Python,List,Compare,Python 3.3,我正在尝试比较多个列表。然而,这些列表通常不是标签。我每次都使用while循环创建一个新的列表,并相应地为它们添加标签。例如,如果while循环运行3次,它将生成一个List1aList2和List3。下面是创建列表的代码片段 for link in links: print('*', link.text) locals()['list{}'.format(str(i))].append(link.text) 所以我想比较每个列表中的字符串,但我想一次比较所有列表,然后打印出公

我正在尝试比较多个列表。然而,这些列表通常不是标签。我每次都使用while循环创建一个新的列表,并相应地为它们添加标签。例如,如果while循环运行3次,它将生成一个
List1
a
List2
List3
。下面是创建列表的代码片段

for link in links:
    print('*', link.text)
    locals()['list{}'.format(str(i))].append(link.text)
所以我想比较每个列表中的字符串,但我想一次比较所有列表,然后打印出公共字符串

我觉得我会用这样的东西,但我不是100%确定

lists = [list1, list2, list3, list4, list5, list6, list7, list8, list9, list10]
common = list(set().union(*lists).intersection(Keyword))

你有几个选择

备选方案a)

使用itertools获得笛卡尔积,这非常好,因为它是一个迭代器

a = ["A", "B", "C"]
b = ["A","C"]
c = ["C","D","E"]

for aval,bval,cval in itertools.product(a,b,c):
    if aval == bval and bval == cval:
        print aval
备选方案b)

使用集合(推荐)

 all_lists = []
 # insert your while loop X times
 for lst in lists:         # This is my guess of your loop running.
     currentList = map(lambda x: x.link, links)
     all_lists.append(currentList) # O(1) operation

 result_set = set()
 if len(all_lists)>1:
      result_set = set(all_lists[0]).intersection(*all_lists[1:]) 
 else:
      result_set = set(all_lists[0])

但是,使用集合会更快

您有多种选择

备选方案a)

使用itertools获得笛卡尔积,这非常好,因为它是一个迭代器

a = ["A", "B", "C"]
b = ["A","C"]
c = ["C","D","E"]

for aval,bval,cval in itertools.product(a,b,c):
    if aval == bval and bval == cval:
        print aval
备选方案b)

使用集合(推荐)

 all_lists = []
 # insert your while loop X times
 for lst in lists:         # This is my guess of your loop running.
     currentList = map(lambda x: x.link, links)
     all_lists.append(currentList) # O(1) operation

 result_set = set()
 if len(all_lists)>1:
      result_set = set(all_lists[0]).intersection(*all_lists[1:]) 
 else:
      result_set = set(all_lists[0])

但是,使用集合将更快,而不是直接修改局部变量()(通常不是一个好主意),使用集合作为容器。此数据结构允许您动态创建新的键值对,而不是依赖于某种方法,这种方法肯定会在某个时候导致
namererror

from collections import defaultdict

i = ...

link_lists = defaultdict(list)
for link in links:
    print('*', link.text)
    link_lists[i].append(link.text)
要删除所有列表中的一个:

all_lists = list(link_lists.values())
common_links = set(all_lists[0]).intersection(*all_lists[1:])
在Python2.6+中,可以将多个iterable传递给。这就是星args在这里所做的


以下是交叉口工作原理的示例:

>>> from collections import defaultdict
>>> c = defaultdict(list)
>>> c[9].append("a")
>>> c[0].append("b")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
set()
>>> c[0].append("a")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
{'a'}

与其直接修改
locals()
(通常不是一个好主意),不如使用作为容器。此数据结构允许您动态创建新的键值对,而不是依赖于某种方法,这种方法肯定会在某个时候导致
namererror

from collections import defaultdict

i = ...

link_lists = defaultdict(list)
for link in links:
    print('*', link.text)
    link_lists[i].append(link.text)
要删除所有列表中的一个:

all_lists = list(link_lists.values())
common_links = set(all_lists[0]).intersection(*all_lists[1:])
在Python2.6+中,可以将多个iterable传递给。这就是星args在这里所做的


以下是交叉口工作原理的示例:

>>> from collections import defaultdict
>>> c = defaultdict(list)
>>> c[9].append("a")
>>> c[0].append("b")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
set()
>>> c[0].append("a")
>>> all = list(c.values())
>>> set(all[0]).intersection(*all[1:])
{'a'}

整个匿名
locals()
业务都很恶心。没有必要。如果您确实需要将标签与某个内容关联,请使用
dict
,但这看起来就像您正在创建列表,我也完全不了解标签的用途。你需要一个任意的“listN”标签吗?整个匿名
locals()
business很恶心。没有必要。如果您确实需要将标签与某个内容关联,请使用
dict
,但这看起来就像您正在创建列表,我也完全不了解标签的用途。你需要一个任意的“listN”标签吗?我使用的是3.3,我不断得到错误TypeError:“dict_values”对象不支持索引。它来自公共链接部分。@user1985351:刚刚更新了代码。Python 3的
.values()
在调用
.values()
时返回字典值的视图,而不是其值的快照。我们可以使用
list
将此视图对象转换为列表。确定错误已消失。现在运行这个程序,当我调用
print(common_links)
时,它只返回
set()
是否有文本实际存在于所有类别中的链接?我已经用一些虚拟数据在本地测试了这段代码,它工作得很好。我刚刚添加了一个示例。这就是您希望代码执行的操作吗?我正在使用3.3,并且不断得到错误类型错误:“dict_values”对象不支持索引。它来自公共链接部分。@user1985351:刚刚更新了代码。Python 3的
.values()
在调用
.values()
时返回字典值的视图,而不是其值的快照。我们可以使用
list
将此视图对象转换为列表。确定错误已消失。现在运行这个程序,当我调用
print(common_links)
时,它只返回
set()
是否有文本实际存在于所有类别中的链接?我已经用一些虚拟数据在本地测试了这段代码,它工作得很好。我刚刚添加了一个示例。这就是您希望代码执行的操作吗?