扩展python字典和更改键值

扩展python字典和更改键值,python,Python,假设我有一个带有2个键的python字典 dic = {0:'Hi!', 1:'Hello!'} 我想做的是通过复制自身来扩展这个字典,但要更改键值。 例如,如果我有一个代码 dic = {0:'Hi!', 1:'Hello'} multiplier = 3 def DictionaryExtend(number_of_multiplier, dictionary): "Function code" 那么结果应该是这样的 >>> DictionaryExtend(m

假设我有一个带有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'}
在本例中,我通过在每个复制步骤中添加乘法器来更改键值。这样做的有效方法是什么


另外,我还计划对列表变量做同样的工作。我的意思是,通过复制列表本身来扩展列表,并更改一些值,如上面的示例所示。任何关于这方面的建议都会很有帮助

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

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

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'}

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

无论如何,这里有一个片段:

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

您可以尝试
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!']

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

正如其他人所提到的,您需要的是一个列表,而不是扩展的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')]

如果键总是从0开始的连续整数范围,那么这个dict应该是一个列表。如果键值并不总是这样,那么您必须详细说明您希望如何“扩展”这条指令。@user2357112初始字典的键值从0开始升序,为什么在添加它时要调用该变量
乘法器
?这只会让人困惑。@我只需要决定扩展字典的大小,这样就需要信息了。但是为什么你不使用它来乘法呢?我是通过逐行读取文件来创建这本字典的,它不是按升序组织的。例如,第一行是1:'Hello!',第二行是0:“嗨。我把每一行添加到一个列表中,顺序就会被打破。所以我认为编字典是有效率的