Python嵌套列表分组

时间:2013-03-22 21:55:33

标签: python python-2.7

我有一个这种格式的嵌套列表:

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

'--------------------------------------------------

4 个答案:

答案 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是什么。

如果它们是字符串,那么字典方法应该可以正常工作。但是,如果它们是其他对象,那么您需要确保它们是不可变的(否则您不能将它们用作字典中的键)。