2013-11-27 183 views
0

我真的想解決這個問題,但我很難。我有元組的嵌套列表的列表:排序列表嵌套在元組中

l1 = [('cherished', ['family', '4.0', '0.0', 'memory', '6.0', '8.0', 'gift', '0.0', '9.0']), 
('lowered', ['flag', '5.0', '0.0', 'chair', '3.0', '0.0', 'volume', '7.0','3.0']), 
('planted', ['plant', '7.0', '7.0', 'seed', '9.0', '28.0', 'tree', '16.0', '0.0'])] 

在每個嵌套列表我有一個字符串後跟兩個浮點數,在上述'family', '4.0', '0.0'的例子。我需要做的是每個第一浮動排序這個列表 - 字符串,浮球,浮球 - 序列,這樣我就碰到這樣的:

l2 = [('cherished', ['memory', '6.0', '8.0', 'family', '4.0', '0.0', 'gift', '0.0', '9.0']), 
    ('lowered', ['volume', '7.0', '3.0', 'flag', '5.0', '0.0', 'chair', '3.0','0.0']), 
    ('planted', ['tree', '16.0', '0.0', 'seed', '9.0', '28.0', 'plant', '7.0', '7.0'])] 

我試着拉拉鍊的列表,並將它們分類整理,使用:

l2 = [] 
for k, v in l1: 
    new_list = sorted(zip(v[::3], v[1::2], v[1::3]), key=lambda x: (x[1]), reverse=True) 
    flattened = [value for pair in new_list for value in pair] 
    new_tuple = (k, flattened) 
    l2.append(new_tuple) 

但結果是一團糟,爲planted,例如,我得到這個:

('planted', ['seed', 'seed', '9.0', 'plant', '7.0', '7.0', 'tree', '28.0', '16.0']), 

我試圖diffente事修改,但不覺得得到任何接近。有關如何糾正該代碼以執行我想要的操作或使用其他方法來完成此操作的任何提示?我真的很感激!

+1

什麼樣的結果,你需要 - '[禮品,0,9,家庭,4,0,內存,6,8 ]'? –

+0

@FerdinandBeyer對不起,格式化時刪除了輸出。更正它。謝謝 – user2962024

回答

1

你的問題基本上可以減小到排序的y值三元組

[ x1, y1, z1, x2, y2, z2, ... ] 

以相反的順序的平面列表。

做到這一點的一種方法是創建三元組的中間列表,對其進行排序,然後將結果展平。既然你有字符串,但是想把它們排序爲數字,你還必須對y的值應用float()

def sorted_triples(L): 
    # Transform [a, b, c, d, e, f, ...] into [(a, b, c), (d, e, f), ...] 
    triples = [L[i:i+3] for i in range(0, len(L), 3)] 

    # Sort each triple by float value of second element in reverse order 
    triples.sort(key=lambda t: float(t[1]), reverse=True) 

    # Flatten list of triples 
    return [x for t in triples for x in t] 

可以按如下方式將此到您的數據:

for k, v in l1: 
    v[:] = sorted_triples(v) 
+0

非常感謝!很酷! – user2962024