扩展python字典和更改键值
假设我有一个带有2个键的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
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:“嗨。我把每一行添加到一个列表中,顺序就会被打破。所以我认为编字典是有效率的