2

两个清单

ListOne = ['steve','rob','jym','rich','bell','mick']
ListTwo = [('steve',22 ,178), ('rob', 23 ,189), ('jym', 25,165), ('steven',18 ,187), ('Manro',16 ,200), ('bell',21 ,167), ('mick', 24 ,180)]

我如何才能从 ListTwo 中为 ListOne 上的学生获取数据,例如two list intersections

输出如:

ListTwo = [('steve',22 ,178), ('rob', 23 ,189), ('jym', 25,165), ('bell',21 ,167), ('mick', 24 ,180)]

我试过这个,但我正在寻找更正式的东西:

for row in ListTwo:   
    if row[0] in ListOne :
        print 'this student exist' + `row[0]`

    else :
        for i,e in enumerate(ListTwo):
        #Check the student with the above results, will be removed
            if row[0] == e: 
                temp=list(ListTwo[i])
                pprint.pprint('I will remove this student : ' + `e`)
                #Remove the Student
                for f, tmp in enumerate(temp):
                     temp[f]= []
                #pprint.pprint(temp)
                ListTwo[i]=tuple(temp)
4

2 回答 2

7

使用列表理解

[rec for rec in ListTwo if rec[0] in ListOne]

为了使其更快,您可以通过首先将列表转换为set来将 list-lookups 替换为 set-lookups :

ListOne = set(ListOne)
于 2013-04-02T05:09:51.310 回答
2

一种方法是麻木的

import numpy
a = numpy.array(list2)
print a[numpy.in1d(a[:,0],list1)]

但我可能会按照 shx2 的建议进行列表理解...... numpy 会改变你的类型

这将占用您的 2d numpy 数组的第 0 列(这是元组的名称)

numpy.in1d[True,False,etc]将根据名称是否在另一个列表中创建一个掩码

然后它采用原始数组并使用布尔索引

>>> a = numpy.array(ListTwo)
>>> a[numpy.in1d(a[:,0],ListOne)]
array([['steve', '22', '178'],
       ['rob', '23', '189'],
       ['jym', '25', '165'],
       ['bell', '21', '167'],
       ['mick', '24', '180']],
      dtype='|S6')
>>>
于 2013-04-02T05:13:22.530 回答