【问题标题】:Iterating through a dictionary that starts at the first key value each iteration遍历从每次迭代的第一个键值开始的字典
【发布时间】:2015-03-31 18:11:05
【问题描述】:

我有一个字典,其中包含键中的用户名和值中的日期。因为我无法按字母顺序对字典进行排序,所以我想遍历字典键(用户名)以匹配包含所有用户名的单独按字母顺序排列的列表中的项目,然后在电子表格中打印相关值(日期)。我遇到的问题是,当它遍历字典时,它不会每次都从字典的开头键开始,并且列表中要匹配的下一个项目已经在字典中遍历。是否有特定的迭代工具,每次都会从头开始?

到目前为止我的代码:

x=0
nd=0
for k, v in namedatedict.items():
    if k == usernamelist[x]:
        sh1.write(nd, col3_name, v)
        x += 1
        nd += 1

为了让您了解我正在做的事情的背景,我正在尝试查找与特定用户名匹配的日期,并将其打印在电子表格中相关用户名的旁边。可能有一种完全不同的方式来遍历这些值,但这是我能想到的唯一方式。任何帮助/指导将不胜感激。

【问题讨论】:

  • 按字母顺序排列的列表是否始终是总用户名+日期集的子集?还是用户名+日期设置为字母列表的子集?还是那两组总是一样的?这个问题的答案对最佳解决方案有很大的影响。
  • 这两个集合的长度总是相同的。

标签: python for-loop dictionary iteration


【解决方案1】:

根据您对我的评论的回答,您拥有按字母顺序排列的列表的唯一原因似乎是获得排​​序顺序。在那种情况下,这个问题就变得简单了; Python 支持通过sorted() 方法按其中一个元素对元组列表进行排序。字典可以通过items() 方法提供键值元组列表。所以,这就变成了:

for name, date in sorted(namedatedict.items(), key = lambda entry: entry[0]):
    # do whatever you need with the name and date. Names will be alphabetical.

【讨论】:

  • 感谢您的回答。忘记了 .items() 它变成了一个可以排序的元组。
【解决方案2】:

这样的事情呢:

for k in usernamelist:
    sh1.write(nd, col3_name, namedatedict[k])
    x += 1
    nd += 1

这将遍历键列表(“用户名”)——并根据该键从字典中获取每个值。

如果usernamelist 不是namedatedict 的键的正确子集,则应使用get 获取值并准备处理不存在键的情况:

for k in usernamelist:
    value = namedatedict.get(k)
    if value is not None:
        sh1.write(nd, col3_name, value)
        x += 1
        nd += 1

你也可以使用异常来处理:

for k in usernamelist:
    try:
        sh1.write(nd, col3_name, namedatedict[k])
        x += 1
        nd += 1
    except KeyError:
        pass

最后,如果您不需要维护一个单独的列表来按顺序获取密钥,您可以在密钥上使用sorted

for k in sorted(namedatedict.keys())
    sh1.write(nd, col3_name, namedatedict[k])
    x += 1
    nd += 1

【讨论】:

  • 只要排序列表始终是字典键的子集,它就可以工作。需要 OP 澄清这一点。
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 2015-09-29
  • 1970-01-01
  • 2021-05-10
  • 2020-01-12
  • 1970-01-01
  • 2020-12-27
  • 2019-02-15
相关资源
最近更新 更多