我有一个这种格式的嵌套列表:
finalValues = [[x,123],[x,23542],[y,56],[y,765],[y,54],[z,98]]
我正在写这样的文本文件(使用索引循环):
outputFile.write("\n--------------------------------------------------")
outputFile.write("\nVariable: " + finalValues[index][0])
outputFile.write("\nNumber: " + finalValues[index][1])
outputFile.write("\n--------------------------------------------------")
outputFile.write("\n")
对于此特定示例,这意味着我将6个唯一输出打印到文本文件中。
将第二个值按第一个值分组的最简单方法是什么?所以我的输出将是(编辑---由于论坛格式化功能,我不能像输出那样完美地格式化,但你可以得到一般的想法):
'-------------------------------------------------- Variable: x Number: 123 Number: 23542 '-------------------------------------------------- '-------------------------------------------------- Variable: y Number: 56 Number: 765 Number: 54 '-------------------------------------------------- '-------------------------------------------------- Variable: z Number: 98 '--------------------------------------------------
答案 0 :(得分:2)
一种方法是使用itertools.groupby
使用operator.itemgetter
对元素进行分组,以获得您感兴趣的键值。列表需要先按键排序。
import operator
import itertools
get_key = operator.itemgetter(0)
finalValues.sort(key = get_key)
for key, group in itertools.groupby(finalValues, get_key):
outputFile.write("\n--------------------------------------------------")
outputFile.write("\nVariable: " + key)
for pair in group:
outputFile.write("\nNumber: " + pair[1])
outputFile.write("\n--------------------------------------------------")
outputFile.write("\n")
答案 1 :(得分:1)
最简单的方法是创建一个列表defaultdict,然后使用子列表的第一个元素作为键遍历列表,并将第二个元素附加到默认列表。
一旦你有了列表,只需遍历键(然后是列表中的列表)来打印你的数据。
import collections
finalValues = [ [x,123] , [x,23542] , [y,56] , [y,765] , [y,54] , [z,98] ]
d = collections.defaultdict(list)
for k in finalValues:
d[k[0]].append(k[1])
在这种情况下,d将评估为
defaultdict(<type 'list'>, {'y': [56, 765, 54], 'x': [123, 23542], 'z': [98]})
答案 2 :(得分:1)
充分利用这两个答案:
defaultdict
是一个字典,初始化值被赋予“默认”值(docs here)。
import collections
finalValues = [ [x,123] , [x,23542] , [y,56] , [y,765] , [y,54] , [z,98] ]
# The dictionary will map each variable to a list of numbers
groupedValues = collections.defaultdict(list)
for variable, number in finalValues:
groupedValues[variable].append(number)
# The next step is to print them out:
for variable, numbers in groupedValues.iteritems():
outputFile.write("\n--------------------------------------------------")
outputFile.write("\nVariable: %s" % variable)
for number in numbers:
outputFile.write("\nNumber: %s" % number)
outputFile.write("\n--------------------------------------------------")
outputFile.write("\n")
答案 3 :(得分:0)
您可以使用字典来处理此问题:
output_dict = {}
for elt in finalValues:
output_dict[elt[0]] = output_dict.get(elt[0], []) + [elt[1]]
for key in output_dict.keys():
outputFile.write("\n--------------------------------------------------")
outputFile.write("\nVariable: " + key
for elt in output_dict[key]:
outputFile.write("\nNumber: " + elt)
outputFile.write("\n--------------------------------------------------")
outputFile.write("\n")
修改强>
再次查看你的问题,目前还不清楚x,y和z是什么。
如果它们是字符串,那么字典方法应该可以正常工作。但是,如果它们是其他对象,那么您需要确保它们是不可变的(否则您不能将它们用作字典中的键)。