比较Python中的多个列表
我正在尝试比较多个列表。然而,这些列表通常不是标签。我每次都使用while循环创建一个新的列表,并相应地为它们添加标签。例如,如果while循环运行3次,它将生成一个比较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) 所以我想比较每个列表中的字符串,但我想一次比较所有列表,然后打印出公
List1
aList2
和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()
是否有文本实际存在于所有类别中的链接?我已经用一些虚拟数据在本地测试了这段代码,它工作得很好。我刚刚添加了一个示例。这就是您希望代码执行的操作吗?