两个列表
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)]
我如何才能从ListOne中获取ListTne中的数据,就像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)
答案 0 :(得分:6)
[rec for rec in ListTwo if rec[0] in ListOne]
为了加快速度,您可以将列表查找替换为set-lookups,方法是先将列表转换为set:
ListOne = set(ListOne)
答案 1 :(得分:2)
一种方式是numpy
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')
>>>