0

同じ長さの 2 つのリストがあります。

alist = ['XX', 'HH', 'GG', 'XX', 'II', 'PP', 'LL', 'TT', 'KK', 'XX']
blist = [2, 3, 5, 5, 9, 8, 9, 4, 7, 2]

alist のどの値が blist で同じ番号を持っているかを知りたいです。結果を次のようにしたい:

2 = XX; 3 = HH; 5 = GG、XX; 9 = II、LL; 8 = PP; 4 = TT; 7 = KK

私はこのようにそれを解決しました:

from collections import defaultdict
adict = {}
a = zip(blist, alist)
for key, value in a:
    adict.setdefault(k, []).append(v)

次の結果が得られます: adict:

{2: ['XX', 'XX'], 3: ['HH'], 4: ['TT'], 5: ['GG', 'XX'], 7: ['KK'], 8: ['PP'], 9: ['II', 'LL']}

しかし、同じ値を 2 回使用する必要はありません。たとえば、2: ['XX', 'XX'] - 代わりに 2: ['XX'] が必要です。

I tried this using 'set' before the list of values:
a = zip(blist, alist)
for key, value in a:
    a.setdefault(k, set[]).append(v)

しかし、それは不平を言いました...何かアイデアはありますか?

4

3 に答える 3

2

defaultdictインポートしたタイプを使用しますが、それ以外は無視します。

from collections import defaultdict

a = defaultdict(set)
for k, v in zip(blist, alist):
    a[k].add(v)

結果:

>>> a
defaultdict(<type 'set'>, {2: set(['XX']), 3: set(['HH']), 4: set(['TT']), 5: set(['GG', 'XX']), 7: set(['KK']), 8: set(['PP']), 9: set(['II', 'LL'])})

defaultdictのサブクラスでdictあり、それ以外は同じように動作します。

于 2013-03-12T15:25:48.707 に答える
2

私は個人的にMartijnのdefaultdictアプローチを使用しますが、現在の試みの問題に対処すると思いました.

あなたのコードの問題:

a = zip(blist, alist)
for key, value in a:
    a.setdefault(k, set[]).append(v)

それは:

  • の後ろはリストzipaなっているため、サポートされません.setdefault
  • kは for ループでは使用されません - 使用する必要がありますkey
  • vforループで使用されていません=使用する必要がありますvalue
  • set[]無効な synatx - 新規作成set- 使用set()
  • Asetには.append- がなく、代わりに使用したいadd

修正されたコード:

d = {}
a = zip(blist, alist)
for key, value in a:
    d.setdefault(key, set()).add(value)

必要に応じて以下を調整して印刷します。

for k, v in d.iteritems():
    if k > 5:
        print '{0}: {1}'.format(k, ','.join(v))
于 2013-03-12T15:42:18.837 に答える
0

コードを使用して、次を追加します。

a = {x: set(a[x]) for x in a }
于 2013-03-12T15:32:49.633 に答える