2017-09-14 13 views
2

2つのキーを持つPython辞書があるとします。Python辞書の拡張とキー値の変更

dic = {0:'Hi!', 1:'Hello!'} 

私がしたいことは、この辞書を複製してキー値を変更することです。 例えば、Iコード

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

、その後、この辞書はおそらくリストになるはずです。キーが*常に*そうでないなら、あなたはこのディクテーションをどのように "拡張"したいかを詳しく述べなければならないでしょう。 – user2357112

+0

@ user2357112最初の辞書のキー値は0から始まる昇順です – user42298

+0

なぜあなたはそれを追加するときにその変数を 'multiplier'と呼びますか?それだけが混乱するだろう。 – kindall

答えて

2

あなたが入力秩序を維持するための値とOrderedDictを繰り返すitertoolsを試すことができます。他のコレクション型を扱うについて

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行ずつ読み込んで作成しますが、昇順に並べ替えられていません。たとえば、最初の行は1: 'Hello!'で、2行目は0: 'こんにちは。各行をリストに追加すると、順序が崩れます。だから私は辞書を作ることが効率的だと思った – user42298

0

あなたはしないでください何かを拡張する必要がある場合は、より良い入力形式またはより適切な型を選択する必要があります。

他にも言及したように、拡張dictやOrderedDictではなく、リストが必要です。ここでlines.txtとの例を示します

1:Hello! 
0: Hi. 
2: pylang 

そしてここでは、正しい順序で行を解析する方法です:キーは常に0から始まる整数の連続した範囲であることを行っている場合は

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')] 
関連する問題