2015-06-25 42 views
-1

致所有惊人的程序员,如何对defaultdict(list)进行排序,使得所有列表都基于一个键进行排序?

我想知道如何排序defaultdict(列表)集合,使一个列表的排序顺序(例如defaultdict(list)[list1])应用于其余列表以及。也许一个简短的描述/例子更有用。如果有更好的方法来做到这一点,我也是耳熟能详。

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

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

现在我离开我了defaultdict(名单)命名结构的 '数据':

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

您的示例代码缺少的东西; 'row.items()'从哪里来?它是用于csv中的行吗? – TessellatingHeckler

+0

嘿,哥们,排。items()来自csv模块,与每个行项目关联的键和值对一样。 – lwm

回答

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 
+1

这足以回答我的问题。感谢你的快速回复! – lwm

相关问题