2015-11-19 2 views
0

второй список, отсортированный по первомусписок, чтобы соответствовать другой вложенный список

[['E', 'E', 'C], ['B', 'C', 'A'], ['E', 'B', 'F'], ['D', 'F', 'E']]

+0

В чем причина '['E', 'F', 'D']' to '['D', 'F', 'E']'? – Leb

+1

Неясно, что именно вы пытаетесь сделать. Вы пытаетесь определить, какое направление сортировать каждый из других списков, как по восходящей, так и по нисходящей? Если это так, мы могли бы сказать, что ваш образец должен опускаться, но порядок сортировки других списков в вашем примере «после» в лучшем случае произволен. – Matt

ответ

0

Вот некоторые быстрый код, который я сделал, это работает, но это, возможно, потребуется некоторое рефакторинга:

def getListIndexes(some_list): 
    return [x for x in enumerate(some_list)] 

list1 = [['C', 'B', 'A']] 
list2 = [['C', 'E', 'E'], ['C', 'B', 'A'], ['F', 'B', 'E'], ['E', 'F', 'D']] 

values_before_1 = getListIndexes(list1[0]) 
values_after_1 = getListIndexes(list(sorted(list1[0]))) 

mapping = dict.fromkeys(list(range(len(list1[0])))) 
for item in values_before_1: 
    before, then = [(item[0],x[0]) for i, x in enumerate(values_after_1) if item[1]==x[1]][0] 
    mapping[then] = before 

results = [[None, None, None] for l in range(len(list2))] 
for i, item in enumerate(list2): 
    values = getListIndexes(item) 
    for j in range(len(item)): 
     results[i][mapping[j]] = list2[i][j] 

print "[*] list1 with content: {} has been sorted and now is like: {}\n".format(list1[0], sorted(list1[0])) 
print "[*] list2 with content:\n\n{}\n".format(list2) 
print "...has been sorted based on list1 sorting and now looks like this...\n" 
print results 

Выходные данные:

[*] list1 with content: ['C', 'B', 'A'] has been sorted and now is like: ['A', 'B', 'C'] 

[*] list2 with content: 

[['C', 'E', 'E'], ['C', 'B', 'A'], ['F', 'B', 'E'], ['E', 'F', 'D']] 

...has been sorted based on list1 sorting and now looks like this... 

[['E', 'E', 'C'], ['A', 'B', 'C'], ['E', 'B', 'F'], ['D', 'F', 'E']] 
+0

@ Lcallan, мое удовольствие. Пожалуйста, не забудьте принять мой ответ, если это поможет вам решить проблему :) –

+0

@ Lcallan вот вы где. Проверьте мой обновленный ответ. –

2
ref_list = ['c','b','a'] 
# sort [1,2,3] according to ref_list... viz: ['c','a','b'] => [3,1,2] 
ordering = sorted(range(len(ref_list)), key=lambda i: ref_list[i]) 
for j in range(len(list2)): 
    list2[j] = [list2[j][i] for i in ordering] 
+0

Я буду голосовать за ваш ответ, потому что это лучше, чем у меня. Спасибо, потому что сегодня я чему-то научился! –