如何对defaultdict(list)进行排序,以便根据一个键对所有列表进行排序?

时间:2015-06-25 16:15:22

标签: list python-2.7 sorting csv

致所有令人惊叹的程序员,

我想知道如何对defaultdict(list)集合进行排序,以便将一个列表的排序顺序(例如defaultdict(list)[list1])应用于其余列表。也许简短的描述/示例更有用。如果有更好的方法,我也是耳朵。

示例问题: 我有一个.csv文件,包含许多列(不同的数据类型)和标题行。使用defaultdict(list)我使用:

导入.csv文件
data = defaultdict(list)
Reader = csv.DictReader(open(FilePath, 'r'))
for (k,v) in row.items():
    data[k].append(v)

现在我留下一个名为' data'的 defaultdict(list)。结构:

data = [('varA', <list of n time.struct_time items>),
        ('varB', <list of n other data type items>)',
        ('varC', <list of n other data type items>)']

每个列表(varA,varB,varC)具有完全相同的项目数。假设varA未排序,我将如何根据varA订购所有数据条目。

我知道

sortOrder = [i[0] for i in sorted(enumerate(data['varA']), key=lambda x:x[1])]

返回具有正确索引顺序的列表。有没有办法将此订单应用于其他列表。

注意:我读到的地方

data[varB] = data[varB][sortOrder] 
data[varC] = data[varC][sortOrder] 
鉴于sortOrder是一个数组(不是,上面产生一个列表),

会给我正确的答案。问题是如何在不使用numpy的情况下将sortOrder列表转换为数组。

1 个答案:

答案 0 :(得分:1)

我想我会:

  • 将列表VarA与数字1到n配对,所以:
    • [ b, a, c ]变为[ (1,b), (2,a), (3,c) ]
  • 按值对新列表进行排序,因此:
    • [ (2,a), (1,b), (3,c) ]
  • 取消配对,数字最终的方式是其他列表的排序:
    • [2,1,3]如何使列表按顺序排列:取第二项,第一项,第三项。
  • 对于每一行,将该顺序中的项目放入新列表

未经测试的示例代码:

sort_holder = [(index, item) for (index, item) in enumerate(data['VarA'])]
sort_holder = sorted(sort_holder, key = lambda pair: pair[1])
new_order = [pair[0] for pair in sort_holder]

for var, row in data.items():
    new_list = []
    for index in new_order:
        new_list.append(row[index])
    data[var] = new_list