扩展python字典并更改键值

时间:2017-09-14 04:51:44

标签: python

假设我有一个带2个密钥的python字典。

dic = {0:'Hi!', 1:'Hello!'}

我想要做的是通过复制自身来扩展这个字典,但是更改键值。 例如,如果我有代码

dic = {0:'Hi!', 1:'Hello'}
multiplier = 3
def DictionaryExtend(number_of_multiplier, dictionary):
    "Function code"

然后结果看起来像

>>> DictionaryExtend(multiplier, dic)
>>> dic
>>> dic = {0:'Hi!', 1:'Hello', 2:'Hi!', 3:'Hello', 4:'Hi!', 5:'Hello'}

在这种情况下,我通过在每个复制步骤添加多路径来更改键值。这样做的有效方法是什么?

另外,我还打算为列表变量做同样的工作。我的意思是,通过复制自己来扩展列表并更改一些值,如上所述。对此的任何建议也会有所帮助!

4 个答案:

答案 0 :(得分:2)

目前还不清楚为什么要这样做。如果键总是连续的整数,那么你可能只需要一个列表。

无论如何,这是一个片段:

def dictExtender(multiplier, d):
    return dict(zip(range(multiplier * len(d)), list(d.values()) * multiplier))

答案 1 :(得分:2)

您可以尝试itertools重复值,OrderedDict以维持输入顺序。

import itertools as it
import collections as ct


def extend_dict(multiplier, dict_):
    """Return a dictionary of repeated values."""
    return dict(enumerate(it.chain(*it.repeat(dict_.values(), multiplier))))

d = ct.OrderedDict({0:'Hi!', 1:'Hello!'})
multiplier = 3
extend_dict(multiplier, d)
# {0: 'Hi!', 1: 'Hello!', 2: 'Hi!', 3: 'Hello!', 4: 'Hi!', 5: 'Hello!'}

关于处理其他集合类型,不清楚需要什么输出,但以下修改再现后者并且也适用于列表:

def extend_collection(multiplier, iterable):
    """Return a collection of repeated values."""
    repeat_values = lambda x: it.chain(*it.repeat(x, multiplier))
    try:
        iterable = iterable.values()
    except AttributeError:
        result = list(repeat_values(iterable))
    else:
        result = dict(enumerate(repeat_values(iterable)))
    return result

lst = ['Hi!', 'Hello!']
multiplier = 3
extend_collection(multiplier, lst)
# ['Hi!', 'Hello!', 'Hi!', 'Hello!', 'Hi!', 'Hello!']

答案 2 :(得分:0)

我认为你不需要使用继承来实现这一点。还不清楚结果字典中的键应该是什么。

如果键总是连续的整数,那么为什么不使用列表?

origin = ['Hi', 'Hello']
extended = origin * 3 
extended
>> ['Hi', 'Hello', 'Hi', 'Hello', 'Hi', 'Hello']
extended[4]
>> 'Hi'

如果您想使用键执行不同的操作,只需:

mult_key = lambda key: [key,key+2,key+4] # just an example, this can be any custom implementation but beware of duplicate keys
dic = {0:'Hi', 1:'Hello'}
extended = { mkey:dic[key] for key in dic for mkey in mult_key(key) }
extended
>> {0:'Hi', 1:'Hello', 2:'Hi', 3:'Hello', 4:'Hi', 5:'Hello'}

答案 3 :(得分:0)

您不需要扩展任何内容,您需要选择更好的输入格式或更合适的类型。

正如其他人所提到的,你需要一个列表,而不是扩展的dict或OrderedDict。以下是lines.txt

的示例
1:Hello!
0: Hi.
2: pylang

这是一种以正确的顺序解析行的方法:

def extract_number_and_text(line):
    number, text = line.split(':')
    return (int(number), text.strip())

with open('lines.txt') as f:
    lines = f.readlines()
    data = [extract_number_and_text(line) for line in lines]
    print(data)
    # [(1, 'Hello!'), (0, 'Hi.'), (2, 'pylang')]
    sorted_text = [text for i,text in sorted(data)]
    print(sorted_text)
    # ['Hi.', 'Hello!', 'pylang']
    print(sorted_text * 2)
    # ['Hi.', 'Hello!', 'pylang', 'Hi.', 'Hello!', 'pylang']
    print(list(enumerate(sorted_text * 2)))
    # [(0, 'Hi.'), (1, 'Hello!'), (2, 'pylang'), (3, 'Hi.'), (4, 'Hello!'), (5, 'pylang')]