我已经做了很长时间的python,而且我很擅长这个问题。我有一个列表,其中可能包含其他列表,每个列表包含不同数量的元组。我尝试使用以前回答过的问题,例如grouping python lists of lists,sorting and grouping nested lists和其他方法,例如使用计数器,但它们似乎都没有在我的列表中工作,其输出看起来像这样(这是我的输入数据):
[('T0931', 'AB', '0.7826705747628963')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')] [('T0932', 'AB', '0.63950861050628')] [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]
我认为我的列表(元组列表)的格式与其他问题中使用的格式不同。当我问它的数据类型时,它会出现list,tuple,string但是会多次打印这些答案:
print(type(Data))
# Returns list
print(type(Data[0]))
# Returns tuple
print(type(Data[0][0]))
# Returns str
#output looks like this:
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
即使我尝试使用sorted(第二次尝试)对此列表进行排序,它们也会返回由许多空列表分隔的同一个未组合列表的变体:
# Q is name of list
#attempt 1:
def grouper(sequence):
result = []
for item in sequence:
for members, group in result:
if members.intersection(item):
members.update(item)
group.append(item)
break
else:
result.append((set(item), [item]))
return [group for members, group in result]
output=grouper(Q)
print(output)
#attempt 2:
import itertools
import operator
Q=sorted(q,key=operator.itemgetter(0))
for key,group in itertools.groupby(Q,operator.itemgetter(0)):
print(list(group))
#attempt 3:
from collections import Counter
C = Counter(Q)
for list,v in C.items():
print ([list,]*v)
我想首先通过位置0处的TXXXX编号然后通过位置1处的两个字母对该列表进行分组,同时保留每个组中的所有重复元素。然而,如何对Txxxx数字进行分组的详细说明将有所帮助,因此我可以弄清楚如何对位置1处的字母进行相同的操作。所需的输出应如下所示:
[[('T0931', 'AB', '0.7826705747628963')],[('T0932', 'AB', '0.6395086105062'),('T0932', 'AB', '0.63950861050628')],[('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'), ('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]]
同样在这种情况下,我不相信使字典工作(我在类似问题中看到的事情),因为这只是列表的样本,完整列表在0位包含许多不同的Txxxx数字。
提前谢谢。
答案 0 :(得分:0)
您可以使用defaultdict
保留每个tx /代码组合的所有值
from collections import defaultdict
d = defaultdict(list)
for group in q:
for tx, code, value in group:
d[tx, code].append(value)
答案 1 :(得分:0)
您可以使用group by,就像这样:
my_list=[('T0931', 'AB', '0.7826705747628963'),('T0932', 'AB', '0.63950861050628'),
('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'),
('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'),
('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524'),
('T0932', 'AB', '0.63950861050628'),('T0933', 'AB', '0.8960345460457968'),
('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'),
('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'),
('T0933', 'EF', '0.8941510860547524')]
import itertools
res =[]
for key, value in itertools.groupby(my_list, lambda x: x[0]):
l=[]
for val in value :
l.append(val)
res.append(l)
输出:
[[('T0931', 'AB', '0.7826705747628963')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')], [('T0932', 'AB', '0.63950861050628')], [('T0933', 'AB', '0.8960345460457968'), ('T0933', 'AF', '0.8951297220212914'), ('T0933', 'BC', '0.8951297782393018'), ('T0933', 'CD', '0.8951298105762795'), ('T0933', 'DE', '0.8951299080330034'), ('T0933', 'EF', '0.8941510860547524')]]