在Python中 - 一种选择迭代哪个字典(并操纵值)的方法

时间:2010-07-19 03:19:25

标签: python dictionary

这是我的问题:

假设我有两个词典,dict_a和dict_b。

它们中的每一个都有类似的键和值,我可以用同样的方式操作,实际上这就是我在一大段代码中所做的事情。只有我不想写两次。但是,我做不到这样的事情:

if choose_a == 1:
    for x and y in dict_a.iteritems():
    # goto line 20

if choose_b == 1:
    for x and y in dict_b.iteritems():
    # goto line 20

 # line 20
 # do stuff with x and y.

除了我不知道在这种情况下该怎么做。如果有一个类似的主题,请指出我,如果我违反了任何内容,请原谅我(第一篇文章)。在此先感谢,我感谢任何帮助。

6 个答案:

答案 0 :(得分:4)

也许做这样的事情:

if choose_a == 1: the_dict=dict_a
elif choose_b == 1: the_dict=dict_b

for x,y in the_dict.iteritems():
    # do stuff with x and y.

答案 1 :(得分:3)

def do_stuff( d ):
  for x and y in d.iteritems():
    whatever with x and y
if choose_a == 1: do_stuff( dict_a )    
if choose_b == 1: do_stuff( dict_b )

答案 2 :(得分:2)

如果choose_achoose_b都属实,您希望发生什么?如果它们都不是真的怎么办?这些条件中的任何一种都是可能的......?

你可以负担得起将所有“东西”移到一个单独的函数中,因为有几个答案已经提出,或者由此产生的范围变化是否有问题?

如您所见,您遗留了许多未指定的内容(或完全未指明)。假设最坏的......:

  1. choose_...个变量都可以为true,在这种情况下你需要同时使用dicts
  2. choose_...个变量都可能为false,在这种情况下你不想做任何事情
  3. 由于范围问题,您需要在当前函数中发生“填充”,
  4. ...然后:

    thedicts = []
    if choose_a == 1: thedicts.append(dict_a)
    if choose_b == 1: thedicts.append(dict_b)
    
    for d in thedicts:
        for x, y in d.iteritems():
            ...do stuff _locally_ with x and y...
    

    您可以更简洁地表达thedicts列表的构建,但是,我认为,不是那么明确,可以通过在for语句中进行汇总,例如如下......:

    for d in [d for d, c in zip((dict_a, dict_b), (choose_a, choose_b)) if c]:
    

答案 3 :(得分:0)

只需定义一个函数。

def do_stuff(x, y):
    # Do stuff
    pass

if choose_a == 1:
    for x and y in dict_a.iteritems():
    do_stuff(x, y)

if choose_b == 1:
    for x and y in dict_b.iteritems():
    do_stuff(x, y)

答案 4 :(得分:0)

这个怎么样:

d = dict_a if choose_a else dict_b
for x, y in d.items():
    # do stuff with x and y

显然,假设你要使用其中一个;如果不是这样的话,添加if语句非常简单。此外,您的x and y语法无效,但我想您会明白这一点:)

答案 5 :(得分:0)

您可以将两个词典放在dict中,然后使用键

选择它们

例如:

choice = 'A'  # or choice = 'B'
working_dict = {'A': dict_a, 'B': dict_b}[choice]
for x,y in working_dict.iteritems():
    # do stuff with x and y

这与使用两个标志的方法略有不同。如果你坚持使用该方案,你可以使用类似的东西来设置choice

的值
if choose_a == 1:
    choice = 'A'
elif choose_b == 1:
    choice = 'B'
else: 
    pass # maybe this should raise an exception?

也许以这种方式写它会更容易:

if choose_a == 1:
    working_dict = dict_a
elif choose_b == 1:
    working_dict = dict_b
else: 
    pass # maybe this should raise an exception?

for x,y in working_dict.iteritems():
    # do stuff with x and y