0

編集しました。私はそれらを辞書のリストにしました。aとbが2つの辞書の場合:

a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']}



bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']}

それらを結合したい

{'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']}

私はそれらを結合したい、すなわち

**How to do it in Python without overwwriting and replacing any value?**
4

4 に答える 4

2

私は多分defaultdictここで役立つかもしれないと思います:

from collections import defaultdict

a = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'],['http://www.michaeljackson.com']]]

b = [['Australia', ['http://www.australia.com']], ['COM', ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']]]

d = defaultdict(list)
d.update((v[0],v[1:]) for v in a)
for v in b:
    country_or_com = v[0]
    urls = v[1:]
    d[country_or_com].extend(urls) 

これはあなたが求めるデータ構造ではありませんが、かなり近いです(そして私は好ましいと思います)。

あなたが本当にあなたが持っているフォーマットでそれを望むなら(しかし異なる順序で):

c = []
for k,v in d.items():
   out = [k]
   out.extend(v)
   c.append(out)

結果:

[['Australia', ['http://www.australia.com']],
 ['COM', ['http://www.uk.com'], ['http://www.michaeljackson.com'],['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']],
 ['UK', ['http://www.uk.com']]]

望んだ通りに。

于 2012-09-12T13:39:21.540 に答える
1

リストが辞書の場合は、辞書をマージする必要があります。

>>> a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']}
>>> bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']}
>>> dict(a.items()+bb.items())
{'Australia': 'http://www.australia.com', 'COM': ['http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': 'http://www.uk.com'}

アップデート

これまでの私の答えはそれをします:

>>> sk = list(set(bb.keys()+a.keys()))
>>> sk
['Australia', 'COM', 'UK']
>>> nd
{}

>>> for i in sk: 
...     if i in a.keys():
...        nd[i]=a[i]
... 
>>> nd
{'COM': ['http://www.uk.com', 'http://www.michaeljackson.com'], 'UK': 'http://www.uk.com'}
>>> for i in sk: 
...     if i in bb.keys():
...        nd[i]=bb[i]
... 
>>> nd
{'Australia': 'http://www.australia.com', 'COM': ['http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': 'http://www.uk.com'}

まだ辞書を使用する必要があると思います。これは、CPU効率があまり高くない*方法です。

a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']}
bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']}

sk = list(set(bb.keys()+a.keys()))

nd = {}

for i in sk:
    plholder=[]
    if i in a.keys():
        print i
        print isinstance(a[i], str)
        if isinstance(a[i], str):
            plholder.append(a[i])
        else:
            if i in a.keys():
                for v in a[i]: plholder.append(v)
    if i in bb.keys():
        if isinstance(bb[i], str): plholder.append(bb[i])
        else:
            if i in a.keys():
                for v in bb[i]: plholder.append(v)
    nd[i]=plholder
print nd
{'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']}

*大規模なデータセットの場合、追加が非常に遅くなるため、CPU効率が低くなります。

于 2012-09-12T13:44:27.490 に答える
1

セットの辞書など、別のデータ構造を使用することを検討してください。

a = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'],['http://www.michaeljackson.com']]]
b = [['Australia', ['http://www.australia.com']], ['COM', ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']]]

# convert these to dictionaries with set values
a = {item[0]:set(s[0] for s in item[1:]) for item in a}
b = {item[0]:set(s[0] for s in item[1:]) for item in b}

# define a function to update our dictionary-of-sets data structure
def union_update_setdict(D, *setdicts):
    """Update dictionary D (with `'key':set(value)` items) with items from setdicts.

    If a new key is added to D from setdicts, a shallow copy of the value
    is added to D.
    """
    for setdict in setdicts:
        for k,v in setdict.items():
            try:
                D[k].update(v)
            except KeyError:
                D[k] = v.copy()

union_update_setdict(a, b)



# Now let's test that the code works

expected = [['UK', ['http://www.uk.com']], ['COM', ['http://www.uk.com'], ['http://www.michaeljackson.com'], ['http://www.Australia.com'], ['http://www.rafaelnadal.com'], ['http://www.rogerfederer.com']], ['Australia', ['http://www.australia.com']]]

# put the "expected" results in our new data structure for comparison
expected = {item[0]:set(s[0] for s in item[1:]) for item in expected}

print a
assert expected == a

ひどいデータ構造を本当に使い続ける必要がある場合は、終了時に元に戻すことができます。

terribledatastruct = [[k]+[[item] for item in v] for k,v in a.items()]
print terribledatastruct
于 2012-09-12T14:18:18.907 に答える
1

奇妙なデータ構造は、多くの場合、下に潜んでいる奇妙な悪魔のようなライブラリに適しています。わかりやすくするために、それを適切なデータ構造に変換し、それらを操作してから元に戻すことを提案します。奇妙な構造などで手編みの和集合アルゴリズムを使用することで、実装の問題を回避できます。

まず、データを適切にします。

a_ = { x[0]: set(e[0] for e in x[1:]) for x in a }
b_ = { x[0]: set(e[0] for e in x[1:]) for x in b }

次に、それを使用します。

c_ = defaultdict(set)
for k, v in a_.iteritems():
    c_[k] |= v
for k, v in b_.iteritems():
    c_[k] |= v

次に、それを奇妙な構造に戻します。

return [[k] + [[e] for e in v] for k, v in c_.iteritems()]

このように、実際に行われていることは明らかだと思います。

前提条件:(1)並べ替え順序は重要ではなく、(2)値は1回だけ表示されると想定しています。これのいくつかが真実でない場合は、そのように述べてください。あなたの質問はとても短いので、私はいくつかの解釈をしなければなりませんでした。

setsユニークなショートカット に慣れていない人のために:次c_[k] |= v,のように書くことができます:
c_[k] = c_[k].union(v)

セットを参照してください

于 2012-09-12T14:32:29.890 に答える