背景 我有以下python 3
data = [{'name': 'Jon','id_str': '01'},{'name': 'Tom','id_str': '02'}, {'name': 'Jim','id_str': '03'}]
id = ['01','1133', '02', '2222']
目标:在data
== id
时保留id_str
并附加到列表中。
下面的代码会附加第一个data
点[{'id_str': '01', 'name': 'Jon'}]
(这就是我想要的)
id_list = []
for d in range(len(data)):
t = data[d]
id_str = t['id_str']
if id_str == id[d]:
keep = data[d]
id_list.append(keep)
问题:现在我想转到列表id
中的下一个'1133'
。但由于第二个id
值'1133'
与id_str
data
中的第二个值的{'name': 'Tom','id_str': '02'}
不相等,我希望它跳过这个并继续前进到id
中'02'
的第三个值。由于id ('02')
等于id_str
({'name': 'Tom','id_str': '02'}
),我想追加。
我想继续此过程并循环,直到检查完所有id = ['01','1133', '02', '2222']
为止。本网站http://love-python.blogspot.com/2012/03/get-next-element-from-list-in-python.html。建议我应该在某个时候添加一个计数器,以及if-else
语句,但我已经尝试了很多次,我不知道如何。
我猜我的最终代码看起来像下面的
id_list = []
for d in range(len(data)):
t = data[d]
id_str = t['id_str']
if id_str == id[d]:
keep = data[d]
id_list.append(keep)
elif id_str != id_list[d]:
skip
check next id
else:
if no more id to check
break
期望的最终结果:
[{'name': 'Jon','id_str': '01'},{'name': 'Tom','id_str': '02'}]
问题:我如何实现这些目标:
1)保留并附加所需数据(id == id_str
时)
2)跳过不需要的数据(id != id_str
时)
3)完成骑行id
后休息
(即,id = ['01','1133', '02', '2222']
中的所有元素都被编入索引并与id_str
中的所有data
进行比较
答案 0 :(得分:4)
这是使用列表理解的一种方式。
data = [{'name': 'Jon','id_str': '01'},{'name': 'Tom','id_str': '02'}, {'name': 'Jim','id_str': '03'}]
ids = ['01','1133', '02', '2222']
res = [d for d in data if d['id_str'] in ids]
# [{'id_str': '01', 'name': 'Jon'}, {'id_str': '02', 'name': 'Tom'}]
答案 1 :(得分:3)
只需使用filter
功能:
id_list = filter(lambda x: x['id_str'] in id, data)
这不允许您提前停止,但原始数据列表并非针对您想要的查询而设计。你只能问一个项目的id_str
是什么;在没有扫描列表的情况下,您无法获得具有给定id_str
的项目。
(对于Python 3,id_list
将是迭代器,而不是列表;请改用id_list = list(filter(...))
。)
答案 2 :(得分:0)
而不是if id_str == id[d]:
做if id_str in id
。
除此之外,我建议另一个改变:你可以直接遍历列表,而不是像许多其他语言一样循环遍历索引。
for t in data:
id_str = t['id_str']
if id_str in id:
keep = data[d]
id_list.append(keep)
答案 3 :(得分:0)
已发布的答案很棒,但不尊重您的第三(相当模糊)条件。
以下是:
res = [y for y in [next((d for d in data if d['id_str'] == x), {}) for x in id] if y]
<强>但是,强>
我在这里假设你想要使用id
中的项目一次。这有以下结果:
如果您的初始列表中包含相同且有效的词典
id_str
, 只有其中一个将被包含在res
中,并且没有办法 知道哪一个(dicts没有订购!)
答案 4 :(得分:0)
我认为使用列表理解对您来说很好:
data = [{'name': 'Jon','id_str': '01'},{'name': 'Tom','id_str': '02'}, {'name': 'Jim','id_str': '03'}]
id = ['01','1133', '02', '2222']
out = [d for d in data if d['id_str'] in id]
print(out)
但是如果你想要一个更加程序化的方式,这可能会让你更好地适应你:
def id_filter(data, id):
out = []
for d in data:
if d['id_str'] in id:
out.append(d)
return out
print(id_filter(data, id))