更新字典条目而不指定所有条目

时间:2019-01-23 16:23:03

标签: python dictionary

是否有一种方法可以更新或追加到词典中的所有条目,从而避免写出所有条目。例如,请考虑:

records = {'a': [], 'b': [], 'c': []}

for i in range(0, 10):
    if i % 2 == 0:
        records['a'].append(i)
        records['b'].append(i**2)
        records['c'].append(i**4)
    else:
        records['a'].append(i)
        records['b'].append(i**3)
        records['c'].append(i**5)

这不太难读,但是如果records字典包含更多条目或循环具有更多条件,则可以迅速增加大小。

3 个答案:

答案 0 :(得分:2)

不要在字典中继续引用3个单独的列表。如果要在代码的所有分支中添加所有三个目标,则只需在一个列表中收集元组。您可以随时将它们转置为单独的列表:

entries = []

for i in range(10):
    if i % 2 == 0:
        entries.append((i, i ** 2, i ** 4))
    else:
        entries.append((i, i ** 3, i ** 5))

records = dict(zip('abc', zip(*entries)))

如果需要的话,该循环然后也可以转化为列表理解。

另一种选择是使用局部变量来引用那些列表。您在这里有3个固定的目标是可变的,因此创建固定数量的本地人是微不足道的,并且已经为您节省了大量的样板:

a, b, c = records['a'], records['b'], records['c']
# use a, b and c inside your loops

另一个选择是为每个目标分配单独的功能:

def a_from_i(i):
    return i

def b_from_i(records, i):
    return i ** 2 if i % 2 == 0 else i ** 3

def c_from_i(records, i):
    return i ** 4 if i % 2 == 0 else i ** 5

records = {'a': [], 'b': [], 'c': []}
dispatchers = {'a': a_from_i, 'b': b_from_i, 'c': c_from_i}

for i in range(10):
    for key, handler in dispatchers.items():
        records[key].append(handler(i))

这可能在此处有点过头了,但是随着问题的复杂性增加,对每个字典条目使用单独的函数将使您专注于要在单独的代码单元中构建的每种数据点类型可以自己测试。

如果您以后需要轻松地扩展和添加处理程序,则可以让装饰器添加到调度程序注册器中,而不是像我上面使用的硬编码字典那样。虽然使用分派模式可能会慢一些(函数调用会产生开销,每个函数中的i重新测试会重复测试,等等),可维护性的好处非常大!

答案 1 :(得分:-1)

您可以使用keys()方法:

records = {'a': [], 'b': [], 'c': []}
keys = sorted(list(records.keys()))

for i in range(0, 10):
    for index, k in enumerate(keys):
        if i % 2 == 0:
            records[k].append(pow(i, index*2 if index else 1))
        else:
            records[k].append(pow(i, 1 + index*2))

print(records)

或者甚至从一个简单的键列表开始,这可能会导致类似的事情:

keys = ['a', 'b', 'c']
records = {k: [(pow(i, ((i % 2) + index*2) if index else 1)) for i in range(0, 10)] for index, k in enumerate(keys)}

答案 2 :(得分:-1)

您可以分别使用字典的.keys.items方法分别对键和键,值元组使用python中的字典进行迭代。您可以围绕它构建解决方案。

records = {'a': [], 'b': [], 'c': []}
records_keys = sorted(records.keys()) #Because dictionaries inherently have no order, it is important to reference them reliably during iteration if the condition depends on it
for i in range(10):
    if i % 2 == 0:
        for power, key in enumerate(records_keys):
            records[key].append(i ** max(1, 2*power))
    else:
        for power, key in enumerate(records_keys):
            records[key].append(i ** max(1, 2*power + 1))

在您提供的示例中,还可以使用以下几句话来进一步降低条件。但是,我不知道您是否可以将其应用于您的实际问题。

records = {'a': [], 'b': [], 'c': []}
records_keys = sorted(records.keys())
for i in range(10):
    for power, key in enumerate(records_keys):
        records[key].append(i ** max(1, 2*power + i%2))