2013-03-22 167 views
0

我在这种格式具有嵌套列表:Python的嵌套列表分组

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 

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

回答

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在这种情况下将evalutate到

defaultdict(<type 'list'>, {'y': [56, 765, 54], 'x': [123, 23542], 'z': [98]}) 
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是什么。

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

1

要采取两个答案的最好的:

defaultdict是初始化值被给定一个“默认”值(文档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") 
2

一种方式来做到这一点是使用operator.itemgetteritertools.groupby的元素,让你感兴趣的键值组。名单必须由关键第一排序。

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") 
+0

非常好!我从这个答案中学到了些东西:) – Moshe 2013-03-24 01:51:02