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 的长度
  • sublist2 的长度 = 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

您可以按如下方式获取列表列表:

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))

这为您提供了一个包含list1as 元素的列表。要获得长度,您可以执行以下操作:

d = dict([(key, len(ls)) for key, ls in zip(list1, result)])
于 2012-07-30T17:26:33.603 回答
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 回答
0

获取您的元组列表并根据每个元组中的第一个数字将其拆分为单独的列表。在同一步骤中,将过滤后的列表添加到具有相应键 from 的字典中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)]}


编辑:我误读了这个问题(我以为你想要字典中的实际数据,而不仅仅是长度)。要获取列表的长度而不是内容,只需将第二个列表理解包装在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 回答