比较Python中常见条目的动态列表数(非等长)

时间:2013-07-11 09:12:22

标签: python list comparison elements

我正在尝试比较用户输入和模式匹配动态生成的不同数量和长度的列表。我没有包含所有匹配的代码,但你应该知道我正在尝试做什么。

根据另一个Stack Overflow帖子的建议,我使用了“列表列表”。我已经使用用户输入的查询数来命名列表并访问它们。

在程序结束时,我想对列表进行一些比较,但我无法理解如何做到这一点。首先,我只想比较列表元素并找到所有列表中匹配的列表元素,但是我还想在以后执行其他列表比较。一旦我在'dom_queries'循环中的'查询'之外,我就无法弄清楚如何访问单个列表。

我超级卡住了,真的有些帮助!

谢谢,

# set dom_count and initialise query_list
dom_count = 0
dom_queries = [] 
# get the number of query domains
domain_number = raw_input('How many domains do you want to find intersects for? ')
# Grab query ID's
while dom_count < int(domain_number):
 dom_count += 1
 query_domain  = raw_input('domain ID query ' + str(dom_count) + ': ')
 dom_queries.append(query_domain)

# initialise lists for query_matches
list_of_lists = []
for i in range(len(dom_queries)):
 list_of_lists.append( [] )
list_pos = 0

# do some matching here for each dom_query, incrementing list position for each query 
# and put matches into the list
for query in dom_queries:
 some_match = re.search(r'XYZ',some_line)
 list_of_lists[int(list_pos)].append(some_match.group())
 list_pos += 1

# HERE IS WHERE I'M STUCK!!!
# I would like to compare all list's generated and find list entries 
# that exist in each list (can be any number of lists with different lengths).

for i in range (len(dom_queries)):
 common = list(set(list_of_lists[i] & .... \/^.^\/  ??

2 个答案:

答案 0 :(得分:0)

从您的所有列表中,您可以创建一个集合,其中包含所有列表中包含函数intersection()的所有项目 这可以从Python 2.6开始,你必须首先将列表设置为set。

http://docs.python.org/2/library/stdtypes.html#set.intersection

答案 1 :(得分:0)

首先,只是一个简化。您可以使用列表推导来创建列表的空列表(只是更多Pythonic)。另外,让我们将它设为集合列表而不是列表列表。

list_of_sets = [set() for i in range(domain_number)]

然后我们可以这样做:

common_set = set()
for i, s in enumerate(list_of_sets):
    if i == domain_number - 1:
        break
    common_set = common_set.update(s.intersection(list_of_sets[i+1])

所以,你从一个空集开始,然后对于列表中的每个集,你会发现它与列表中的下一个集合的交集(交集:两者之间的所有共享项)。然后使用update将该交集设置合并到您的公共元素集中。稍后,如果您想手动将项目添加到公共集合,则可以使用add方法。