假设我有一个带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'}
在这种情况下,我通过在每个复制步骤添加多路径来更改键值。这样做的有效方法是什么?
另外,我还打算为列表变量做同样的工作。我的意思是,通过复制自己来扩展列表并更改一些值,如上所述。对此的任何建议也会有所帮助!
答案 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')]