循环遍历iterable并仅保留相关元素

时间:2018-03-05 16:05:13

标签: python for-loop if-statement

背景 我有以下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进行比较

5 个答案:

答案 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))