2013-07-11 1 views
0

Я пытаюсь сравнить списки разных чисел и длины, которые были созданы динамически с помощью ввода и сопоставления шаблонов. Я не включил весь соответствующий код, но вы должны понять, что я пытаюсь сделать.Сравнение динамического числа списков (не равной длины) для общих записей в Python

Следуя советам другого столбца переполнения стека, я использовал «список списков». Я использовал количество запросов, введенных пользователем, чтобы назвать списки и получить к ним доступ.

В конце программы я хочу провести сравнение между списками, но я не могу понять, как это сделать. Для начала я просто хотел бы сравнить элементы списка и найти те, которые соответствуют во всех списках, однако я также хотел бы выполнить другие сравнения списков позже. Я просто не могу понять, как получить доступ к отдельным спискам, когда я за пределами цикла «для запросов в 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] & .... \/^.^\/ ?? 
+0

Это, вероятно, не самый эффективный способ, но я бы просто перебирал все элементы в каждом списке и проверял каждый элемент, если они находятся во всех других списках. Но, как сказано; должно быть больше питонических способов сделать это. – kramer65

ответ

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.

+0

Большое спасибо за помощь! Я понимаю подход, но я все еще изо всех сил пытаюсь понять, как это работает и как добавлять элементы в каждый набор на лету. Как только у меня будет совпадение, я бы хотел добавить к текущему рабочему набору (определенному list_pos, который увеличивает каждый dom_query). Когда у меня есть регулярное выражение, я просто не уверен, как добавить/обновить правильный набор/список? Я пытаюсь >> set (int (list_pos)). Update (match.group()), но получаю Typerror: объект int не iserable .... Как я могу синтаксически ссылаться на первый набор, например, чтобы поместить данные в??? – user1995839

+0

Вы можете добавить отдельный элемент в набор с помощью метода 'add()'. 'update()' для объединения двух наборов. Я объясню ответ. –

+0

Спасибо, что нашли время, чтобы попробовать и упростить вещи для меня !!! То, в чем я застрял, заключается в том, что я не уверен, как добавлять регулярные выражения в набор для каждого dom_query в цикле. как я могу синтаксически отправлять данные регулярного выражения соответствия в правильный набор для каждой из dom_queries? В моем исходном вопросе я использовал «list_of_lists [int (list_pos)]. Append (some_match.group())», а list_pos позволил мне настроить целевой список. set [int (list_pos)]. add (some_match.group()) не работает.Ключевой вопрос, на который я застрял, - это определить каждый целевой набор, когда я хочу поставить совпадения где-то .... * Извините за эссе *:/и thx! – user1995839

0

Из всех списков вы можете создать один набор, который будет содержать все элементы, которые присутствуют во всех списках с функцией пересечения() Это работает, начиная с Python 2.6 и вы Сначала нужно сначала перечислить списки.

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

 Смежные вопросы

  • Нет связанных вопросов^_^