2017-09-14 118 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')]