0

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

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 个独特的输出打印到文本文件中。

将第二个值按第一个值分组的最简单方法是什么?所以我的输出将是(编辑---由于论坛格式化功能,我无法像我的输出一样完美地格式化它,但你可以得到一般的想法):

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

变量:x

数量:123

编号:23542

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

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

变量:y

数量:56

编号:765

数量:54

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

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

变量:z

数量:98

'---------------------------------------------------- -
4

4 回答 4

2

一种方法是itertools.groupby使用 using对元素进行分组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")
于 2013-03-22T23:06:35.103 回答
1

充分利用这两个答案:

Adefaultdict是一个字典,初始化值被赋予一个“默认”值(此处的文档)。

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")
于 2013-03-22T22:47:04.247 回答
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]})
于 2013-03-22T22:24:09.367 回答
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 是什么。

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

于 2013-03-22T22:30:23.530 回答