2013-11-27 8 views
0

저는이 문제를 해결하려고 애 쓰고 있지만 힘든 시간을 보내고 있습니다. I는 두 개의 플로트 수에 따라 문자열을 각리스트에서 중첩튜플에 중첩 된 목록 정렬

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' 위 예 : I 중첩리스트와 튜플들의 목록이있다.

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'])] 

나는 목록을 압축하는 시도하고 그것을 정렬 : 내가 좋아하는 뭔가를 할 수 있도록, 순서 - 문자열, 부동, 플로트 - 내가 뭘해야 각각의 첫 번째 플로트하여이 목록을 정렬하는 것입니다

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

내가 그것을 개정 diffente 일을 시도했지만 어떤 가까워지고 느끼지 않는다 : 예를 들어, 나는이 얻을,

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를 들어, 엉망 : 사용. 그 코드를 수정하여 내가 원하는 것을 할 수있는 방법이나 그것을 성취 할 수있는 다른 방법에 대한 조언? 정말 고마워!

+1

어떤 종류의 결과는 당신이 필요로 할 -'[선물, 0, 9, 가족, 4, 0, 메모리, 6, 8 ]'? –

+0

@FerdinandBeyer 형식을 지정할 때 출력을 삭제했습니다. 그것을 정정했다. 감사합니다 – user2962024

답변

1

귀하의 문제는 기본적으로 y의 값을 기준으로 역순으로 트리플

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

의 단순 목록을 정렬 줄일 수 있습니다.

이렇게하는 한 가지 방법은 중간 단계의 트리플 목록을 만들고 정렬 한 다음 결과를 병합하는 것입니다. 문자열을 가지고 있지만 숫자로 정렬하려면 float()y의 값에 적용해야합니다.

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