4

2つのリストがあるとします。

l1 = [['b', (1, 1)], ['b', (1, 2)], ['b', (1, 3)], ['a', (1, 5)],
      ['b', (2, 1)], ['b',(3, 1)]]

l2 = ['A','B','C']

この形式で辞書を作成するにはどうすればよいですか?

dct = {'A': len(sublist1), 'B': len(sublist2), 'C' : len(sublist3)}

どこ

sublist1 = [['b', (1, 1)], ['b', (1, 2)], ['b', (1, 3)], ['a', (1, 5)]]
sublist2 = [['b', (2, 1)]]
sublist3 = [['b',(3, 1)]]

私のl1が以下のようになったらどうなりますか?

ls1 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2)]]    

次に、私の出力は次のようになります。

dct = {'A': len(sublist1), 'B': len(sublist2)}

どこ

sublist1 = [[(1, 1),(1, 2),(1, 3),(1, 4)]]
sublist2 = [[(2, 1),(2, 2),(2, 3)]]

全体的な問題は一般的な方法で解決できますか?

4

5 に答える 5

8

これはうまくいくようです:

from itertools import groupby

key = lambda x: x[1][0]
lens = [len(list(g)) for k, g in groupby(sorted(l1, key=key), key=key)]
dct = dict(zip(l2, lens))

Aが1と一致し、Bが2と一致すると仮定したときに、正しく推測できたと思います。

Re:OP編集

(2, 3)あなたのアイテムがどこから来たのかわかりません、sublist2それは間違いだと思います。また、ここでネストされたリストを使用しても目的がないため、単一要素リストls1は実際にはタプルの直接コンテナーであることが意図されていたと思います。もしそうなら、これが一般的な解決策のための私の提案です:

from itertools import groupby
from string import ascii_uppercase

key = lambda x: x[0]
lens = [len(list(g)) for k, g in groupby(sorted(l1, key=key), key=key)]
dct = dict(zip(ascii_uppercase, lens))

したがって、大きな変更はありません。このzip関数は、長さが等しくない引数を指定すると、最短の引数と同じ長さのリストを返します。この動作は、この状況に適しています。

最初のタプル要素に26を超える異なる値がある場合、このソリューションは機能しなくなり、26番目よりも大きい値は無視されることに注意してください。

于 2012-07-31T11:43:57.120 に答える
1
groups = itertools.groupby(l1, lambda x: x[1][0])
dict(zip(l2, map(len, (list(list(g[1]) for g in groups)))))

結果は

{'A': 4, 'B': 1, 'C': 1}
于 2012-07-31T11:45:08.513 に答える
0
>>> l1 = [['b', (1, 1)], ['b', (1, 2)], ['b', (1, 3)], ['a', (1, 5)], ['b', (2,
1)], ['b',(3, 1)]]
>>> dct = {'A': 0, 'B' : 0, 'C': 0}
>>> translation = {1: 'A', 2: 'B', 3: 'C'}
>>> for list_ in l1:
...     letter, tuple_ = list_
...     num1, num2 = tuple_
...     t = translation[num1]
...     dct[t] += 1
...
>>> dct
{'A': 4, 'C': 1, 'B': 1}
于 2012-07-31T11:46:35.363 に答える
0
from collections import defaultdict

lst = [['b', (1, 1)], 
       ['b', (1, 2)],
       ['b', (1, 3)],
       ['a', (1, 5)],
       ['b', (2, 1)],
       ['b', (3, 1)]]  #test list

def mapping(x):
    """ convert 1 to A, 2 to B and so on """
    return chr(ord('A')+x-1)

dct = defaultdict(int)

for _, tple in lst:
    k, _ = tple
    dct[ mapping(k) ] += 1

print (dct) # defaultdict(<type 'int'>, {'A': 4, 'C': 1, 'B': 1})
于 2012-07-31T11:52:23.230 に答える
-1

私はこれをしただろう:

dct = dict((k, len([l for l in l1 if l[1][0] == i + 1]))
           for i, k in enumerate(l2))
于 2012-07-31T11:48:23.473 に答える