0

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

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

在程序结束时,我想在列表之间进行一些比较,但我不知道如何做到这一点。首先,我只想比较列表元素并在所有列表中找到匹配的元素,但是我还想在以后执行其他列表比较。一旦我在 'for query in 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] & .... \/^.^\/  ??
4

2 回答 2

0

从所有列表中,您可以创建一个集合,该集合将包含所有列表中存在的所有项目,使用函数 intersection() 这从 Python 2.6 开始有效,您必须首先将列表转换为集合。

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

于 2013-07-11T11:05:49.847 回答
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方法。

于 2013-07-11T11:06:13.257 回答