2
list1 =  ['A', 'B']
list2 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]]

次のような出力が必要です。

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

今私がそれを知っているなら:

  • サブリストの長さ1=4
  • サブリストの長さ2=4

次に、これらすべてを次のような辞書に入れるにはどうすればよいですか。

{'A':length of sublist1, 'B':length of sublist2}
4

4 に答える 4

4

split と groupby の使用:

>>> from itertools import groupby
>>> data = [map(int, (z for z in x.split(','))) for x in string1.split()]
>>> a, b = [list(j) for j in groupby(data, key=operator.itemgetter(0))]
>>> a
[[1, 1], [1, 2], [1, 3], [1, 4]]
>>> b
[[2, 1], [2, 2], [2, 3], [2, 4]]

次に、次のことができます。

>>> dict(zip(list1, (len(i) for i in (a,b))))
{'A': 4, 'B': 4}
于 2012-07-30T17:27:17.587 に答える
1

データを少し調整して、希望どおりに縮小する必要があるようです。以下の最初のセクションのように、辞書を作成してから、辞書で値を探す必要があります。サンプルデータのコードは次のとおりです。あなたはそれを積み上げるためにアベルでなければなりません。

>>> string1 = '1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4'
>>> list1 = string1.split(',')
>>> list2 = [tuple(map(int, a.split(','))) for a in list1]
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]

>>> temp_dict = {}
>>> for each in list2:
...     a = each[0]
...     if a in temp_dict:
...             temp_dict[a].append(each)
...     else:
...             temp_dict[a] = [each]
... 
>>> temp_dict.values()
[[(1, 1), (1, 2), (1, 3), (1, 4)], [(2, 1), (2, 2), (2, 3), (2, 4)]]
于 2012-07-30T17:28:40.580 に答える
1

次のようにリストのリストを取得できます。

from collections import defaultdict

data = defaultdict(list)
for val in string1.split():
    v1, v2 = val.split(',')
    data[v1].append(v2)
result = [[(int(key), int(v)) for v in values] for key, values in data.items()]

辞書を取得するには、次のようにします。

d = dict(zip(list1, result))

これにより、キーとしての要素を含むリストが得list1られます。あなたができる長さを取得するには:

d = dict([(key, len(ls)) for key, ls in zip(list1, result)])
于 2012-07-30T17:26:33.603 に答える
0

タプルのリストを取得し、各タプルの最初の番号に基づいて個別のリストに分割します。同じ手順で、フィルタリングされたリストを からの対応するキーを使用してディクショナリに追加しlist1ます。の二重括弧list2(下にコピー) があるため、実際のデータは にありlist2[0]ます。

//note the double brackets, data is in list2[0], not list2
list2 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]]

d = dict()

for i in range (0, len(list1)):
     d[list1[i]] = [x for x in list2[0] if x[0] == i+1]
     //on the first run though, list[i] will be 'A' and will be set to [(1, 1), (1, 2), (1, 3), (1, 4)]
     //on the 2nd run though, list[i] will be 'B' and will be set to [(2, 1), (2, 2), (2, 3), (2, 4)]

印刷dすると、フォーマットされたデータが表示されます

print(d)
//prints {'A': [(1, 1), (1, 2), (1, 3), (1, 4)], 'B': [(2, 1), (2, 2), (2, 3), (2, 4)]}


編集:質問を読み違えました(長さだけでなく、辞書に実際のデータが必要だと思いました)。内容ではなくリストの長さを取得するには、2 番目のリスト内包表記をlen()likeでラップするだけです。

len([x for x in list2[0] if x[0] == i+1])

その変更後d、データではなく長さが含まれます。

print(d) //{'A': 4, 'B': 4}
于 2012-07-30T17:36:54.833 に答える