将列表与另一个嵌套列表(unorded)进行比较并输出列表

时间:2015-12-03 01:56:36

标签: python list python-2.7

这是我的清单:

operator <<

例如,取y [0]并将其与x [0] [0] ~x [2] [2]进行比较,然后在x中打印具有y元素的列表(嵌套列表)。

此函数应将y中的所有元素与x

中的每个元素进行比较 我已经考虑了2天了,我无法弄明白。请帮忙!

7 个答案:

答案 0 :(得分: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]

这很好看且可读。

答案 1 :(得分:2)

您可以使用内置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中是否找到了每个子列表的第二个元素

修改

如果您确定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']]

答案 2 :(得分:0)

使用列表理解:

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

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

答案 3 :(得分:0)

参见clear loop方法

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

答案 4 :(得分:0)

简单的嵌套循环问题。只需遍历x中的所有嵌套列表,如果第二个值在y中,则打印出来。

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

或者附加到结果列表并在比较后打印,具体取决于您的需要。

答案 5 :(得分:0)

运行y,使用'in'

检查x
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']

答案 6 :(得分:-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)