使用与字符串匹配的键循环字典项

时间:2019-02-13 21:39:36

标签: python python-3.x

有没有办法使此forif单行显示?我需要遍历所有以'a'开头的键的项目

>>> mydict
{'aName': 'Nancy', 'aAge': '25', 'bName': 'Don', 'bNumber': '21'}
>>> for k,v in mydict.items():
...    if k.startswith('a'):
...       print(k,v)
...       # do some processing here
aName Nancy
aAge 25

我认为应该有一种pythonic的方法来做到这一点?像for k,v in mydict.items() with k.startswith('a'):

3 个答案:

答案 0 :(得分:1)

您的3班轮很好。至于更短:您几乎已经拥有了-for循环不能有限定词-您要么需要重新限制一下内容:

d = {'aName': 'Nancy', 'aAge': '25', 'bName': 'Don', 'bNumber': '21'} 

# restrict the things you loop over by qualifying them as generator
for k,v in (tup for tup in d.items() if tup[0].startswith("a")):
    print(k,v)

或者您使用分解和sep="\n"将打印语句创建为单行:

print( *( f"{k} {v}" for k,v in d.items() if k.startswith("a")), sep="\n")

输出(两种情况):

aName Nancy
aAge 25

答案 1 :(得分:1)

您拥有的完全是Pythonic。这是清晰,明确,易于阅读的,并且是您在软件中看到的非常常见/合理的模式。没有人会被它愚弄/困惑。

要回答您的问题,如果您真的想单行for / if,请执行以下操作:

for k,v in {key: value for key, value in my_dict.items() if key.startswith('a')}.items():
    print(k,v)

不幸的是,这与您已有的东西有些混淆(有6个变量,包括一个匿名变量,而不仅仅是3个)。另一个选择是采用相同的想法(先过滤再迭代与再过滤再迭代),并将其分成两行(以提高可读性/语义):

my_dict_startswith_a = {key: value for key, value in my_dict.items() if key.startswith('a')}
for k, v in my_dict_startswith_a.items():
    print(k,v)

但是只要坚持拥有的东西即可。看起来不错。

答案 2 :(得分:0)

print([k + " " + v for k, v in mydict.items() if k.startswith('a')])

这称为列表理解。这个里面也有一个if语句