致所有令人惊叹的程序员,
我想知道如何对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列表转换为数组。
答案 0 :(得分:1)
我想我会:
[ 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