2015-12-03 4 views
2

Вот мои списки:сравнения списка в другой вложенный список (unorded) и вывести список

x = [['Godel Escher Bach', '1979', 'Douglas Hofstadter'], ['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 
y = ['2014', '2015', '2014'] 

Возьмем, например, у [0] и сравните его с х [0] [0] ~ х [2] [2], а затем распечатать список (вложенный список) в x, который имеет элемент в y.

Эта функция должна сравнить все элементы у к каждому элементу х

л думали об этом в течение 2-х дней, и л не могу понять это. Пожалуйста помоги!

+0

скажите мне, нужно ли что-то прояснить. – Sbioer

+0

Каков ожидаемый результат для данного списка? – falsetru

+0

[[«Что если?», «2014», «Рэндалл Мунро»], [«Пояснение», «2015», «Рэндалл Мунро»], [«Алан Тьюринг: Энигма», «2014», «Андрей Hodge ']] – Sbioer

ответ

3

Как я понимаю, вы хотели бы составить список книг в x, дата публикации которых находится в y. Это должно сделать это:

>>> [b for b in x if b[1] in y] 

[['What if?', '2014', 'Randall Munroe'], 
['Thing Explainer', '2015', 'Randall Munroe'], 
['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 

y вероятно, должен быть set здесь. Прирост производительности будет незначительным, так как y настолько малы, но она является набором передает, как вы собираетесь его использовать:

years = {'2014', '2015', '2014'} 

Наконец, вы можете использовать namedtuple из collections представлять свои книги. Что-то вроде:

from collections import namedtuple 
Book = namedtuple('Book', 'name year author') 
books = [Book(b) for b in x] 

Тогда приведенный выше список понимание становится:

[b for b in books if b.year in years] 

что приятно и читаемым.

+0

Ницца! Спасибо! – Sbioer

0

Использование списка понимание:

list(i for i in x if y[0] in i) 

>>> [['What if?', '2014', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 
+2

Это неполное решение - что относительно лет, которые не являются первым элементом в 'y'? – TigerhawkT3

+0

Вы пропустили '2015', но спасибо – Sbioer

0

см метод ясно Петля

output = [] 
for yy in y: 
    for xlist in x: 
     for xx in xlist: 
      if yy == xx: 
       output.append(xlist) 
       break 
print output 
+0

Он получил некоторый вложенный список, но спасибо – Sbioer

0

Easy проблемы вложенного цикла. Просто повторите все вложенные списки в x, и если второе значение находится в y, распечатайте его.

for nested in x: 
    if nested[1] in y: 
     print(nested) 

Или добавить к списку результатов и распечатать после сравнений, в зависимости от того, что вы хотите.

3

Вы можете выбирать то, что вы хотите с помощью встроенного filter метода:

>>> filter(lambda s: s[1] in y, x) 
[['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 

Что он делает:

Он перебирает каждый список из вашего x списка и проверить, если второй элемент каждого подсписок находится в y[1], используя функцию lambda

Edit:

Приведенный выше код будет работать, если вы уверены, что даты в каждом суб списке x сохранить тот же индекс, что s[1],

Но в случае, вы не можете гарантировать, что, то я предпочитаю следующий код (Я добавил другой элемент x с различными индексами Дата:

>>> z = [['Godel Escher Bach', '1979', 'Douglas Hofstadter'], ['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge'],['2015','Thing Explainer', 'Randall Munroe'], ['Alan Turing: The Enigma', 'Andrew Hodge','2014']] 
>>> 
>>> 
>>> filter(lambda s: set(s).intersection(y), z) 
[['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge'], ['2015', 'Thing Explainer', 'Randall Munroe'], ['Alan Turing: The Enigma', 'Andrew Hodge', '2014']] 
+0

Я не понимаю этого, но спасибо в любом случае – Sbioer

0

Запуск через у, проверка на х, используя 'в'

x = [['Godel Escher Bach', '1979', 'Douglas Hofstadter'], ['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 
y = ['2014', '2015', '2014'] 
for a in y: 
    print("""{}:""".format(a)) 
    for b in x: 
     if a in b: 
      print(b) 

производит:

2014: 
['What if?', '2014', 'Randall Munroe'] 
['Alan Turing: The Enigma', '2014', 'Andrew Hodge'] 
2015: 
['Thing Explainer', '2015', 'Randall Munroe'] 
2014: 
['What if?', '2014', 'Randall Munroe'] 
['Alan Turing: The Enigma', '2014', 'Andrew Hodge'] 
-1

Проверьте этот код: вы можете запустить его в качестве модуля. он возвращает список совпадений с каждым элементом, являющимся списком индекса по y, и индексы в x

def mifunc(x, y): 
    coincidence = [] 
    for alpha in range(len(x)): 
     for beta in range(len(x[alpha])): 
      for gamma in range(len(y)): 
       if y[gamma] == x[alpha][beta]: 
        coincidence.append([gamma, [alpha, beta]]) 
    return coincidence 


x = [['Godel Escher Bach', '1979', 'Douglas Hofstadter'], ['What if?', '2014', 'Randall Munroe'], ['Thing Explainer', '2015', 'Randall Munroe'], ['Alan Turing: The Enigma', '2014', 'Andrew Hodge']] 
y = ['2014', '2015', '2014'] 

if __name__ == '__main__': 
    coincidence = mifunc (x, y) 
Смежные вопросы