【问题标题】:Iterating over part of dictionary keys迭代部分字典键
【发布时间】:2020-06-25 23:23:34
【问题描述】:

我是 Python 新手,我想知道如何遍历字典列表中的部分键。

假设我有类似的东西:

OrderedDict([('name', 'Anna'), ('AAA', '15'), ('BBB', '49'), ('CCC', '38')])
OrderedDict([('name', 'Bob'), ('AAA', '31'), ('BBB', '21'), ('CCC', '41')])
etc.

我需要检索和迭代 AAA、BBB、CCC(键,而不是值),但是:

  • 只有一次(不是对列表中的每个 dict 重复,而是一次,例如仅对 Anna 重复)
  • 跳过“名字”,只是那些追随者
  • 实际上,我有更多这些键(超过 10 个),所以问题是如何迭代而不是硬编码

如果你能帮忙我会很高兴

非常感谢!

【问题讨论】:

  • 所有的字典都有相同的键吗?
  • 我相信您会发现this question 的答案非常有用。您将需要处理迭代的中断以及条件条件或其他操作中某些键的跳过,但该资源应该可以帮助您入门。
  • @gallen 这并不能真正解决列表中多个字典的问题。
  • 然后遍历list_of_dicts[0],跳过name
  • 这能回答你的问题吗? Iterate over a dict except for x item items

标签: python dictionary iteration


【解决方案1】:

只需遍历第一个列表,并检查它是否为 name,以便您可以跳过它。

for key in list_of_dicts[0]:
    if key != 'name':
        print(key)

【讨论】:

  • 非常感谢!这是需要的。有没有办法打印出特定的关键列?例如,如果我只想打印第 4 列和第 5 列中的键?
  • "只有一次(不是对列表中的每个字典都重复,而是一次)"
  • @Sabie 关键列是什么意思?您的预期输出是什么?
  • @Barmar 也许 tuple 在这里是一个更正确的词,而不是 column。就像名字是 0,AAA - 首先,假设我有一个很长的列表,只需要从那里得到特定的键,例如,我需要元组 4-5 中的键
  • keys = list(list_of_dicts[0].keys()) 那么你可以使用keys[4]keys[5]
【解决方案2】:

您可以使用以下方法从第一行中提取键:

keys = (key for key in list_of_dicts[0] if key != 'name')

现在您可以使用以下方式遍历键:

for var in keys:
    print(var)

【讨论】:

  • OP 说“我是 python 新手”,所以你推出了生成器理解...
  • 哈哈,好点 :-) 。不过我觉得没关系。我很高兴能在任何学习阶段介绍做事的新方法。
  • @Alterlife 谢谢你,我很高兴学习所有新方法 :)
【解决方案3】:

我不确定这是否是最好的方法,但我会这样做:

Dict = OrderedDict([('name', 'Anna'), ('AAA', '15'), ('BBB', '49'), ('CCC', '38')])
keys = [] # keys is an empty list

for i in Dict: # Iterate over all keys in the dictionary
    if i != 'name': # Exclude 'name' from the list
        keys.append(i) # Append each 'i' to the list

这将为您提供字典中每个键的列表,键,不包括“名称”。
您现在可以像这样遍历键:

for i in keys:
    print(i) # Do something with each key

如果您还想迭代这些值:

for i in keys:
    print(Dict[i]) # Do something with each value

【讨论】:

    【解决方案4】:

    您将使用for 循环。这是一个例子(我打电话给i,因为我不知道你怎么称呼那个函数的参数):

     i = [('name', 'Anna'), ('AAA', '15'), ('BBB', '49'), ('CCC', '38')]
     for a in range(len(i)):
         print(i[a][1])
    

    上面得到a的索引,在元组内部(有2个元素,所以01)得到第二个索引。

    注意:

    您可能想要创建一个嵌套的 for 循环来获取元组中的理想值。

    【讨论】:

    • 你没有跳过name
    • 为什么使用range() 而不是for a in i:
    • 我的意思是你可以。我从来没有说过你不能。但是对于初学者来说,使用范围似乎更容易。让您熟悉关键字范围和 len :)
    • 我认为我们应该强烈鼓励初学者学习for var in iterator,而不是不必要地使用范围。它更 Pythonic。
    • 除非我遗漏了什么,否则这似乎并不能真正解决问题。
    【解决方案5】:

    你可以这样做:

    lst = [{...}, {...}, {...}, {...}, ...]
    
    f = ['name']
    for d in lst: # For every dict in the list
        for k in d: # For every key in the dict
            if k not in f: # If the key is not in the list f
                # Do something
                f.append(k) # Add that key to f so the program won't iterate through it again
    


    更新

    (我刚刚发现每个字典都有相同的键,所以没有必要做所有这些检查):

    lst = [{...}, {...}, {...}, {...}, ...]
    
    for d in lst: # For every dict in the list
        for k in d: # For every key in the dict
            if k != 'name': # If the key is not 'name'
                # Do something
    

    【讨论】:

    • 这是我最初的答案(除了我使用的是集合而不是列表),但后来她评论说每个 dict 都有相同的键,所以没有必要做所有这些检查。
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2016-01-04
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多