2017-09-14 92 views
2

假设我有一个带2个键的Python字典。扩展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'} 

在这种情况下,我通过在每个重复步骤添加乘法器改变的关键值。这样做的有效方式是什么?

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

+3

如果键总是会从0开始的整数连续范围,然后这个字典应该是一个列表。如果键*不会总是那样,那么你将不得不详细说明你想要这个字典是如何“扩展”的。 – user2357112

+0

@ user2357112初始字典的关键值是从0开始的升序0 – user42298

+0

为什么在添加它时调用变量'multiplier'?这只会让人困惑。 – kindall

回答

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!'] 
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'} 
2

它不是立即清楚你为什么会想这样做。如果键总是连续的整数,那么你可能只是想要一个列表。

总之,这里的一个片段:

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

我通过逐行读取文件来制作这本字典,并且它没有按照升序排列。例如,第一行是1:'Hello!',第二行是0:'嗨。我将每行添加到列表中,订单将被打破。所以我认为制作字典是有效的 – user42298

0

你不需要扩展任何东西,你需要选择一个更好的输入格式或更合适的类型。

正如其他人所说,你需要一个列表,而不是一个扩展的字典或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')]