2014-11-20 2 views
1

Этот вопрос похож на вопрос «Выравнивание по спискам в python», но у меня есть проблема с использованием словаря из-за повторных чисел для потенциальных ключей.Выравнивание двух списков с дублирующимися ключами

Вот пример. Начните с этих 2 списков:

Если бы я использовал словарь, это были бы ключи. [5,6,6,1,6,1,6,1,1,2,1,2,1,2,2,1]

[13,14,15,10,16,11, 17,12,12,13,13,14,14,15,16,17]

Я могу изменить первый список, как я хочу его, что:

[5,6, 6,6,6,1,1,1,1,1,1,2,2,2,2,1]

Я хочу, чтобы второй список сохранял одно и то же выравнивание, в первый список и выглядел точно например: [13,14,15,16,17,10,11,12,12,13,14,13,14,15,16,17]

Обратите внимание, что это важно в списке потенциальных ключей есть повторяющиеся значения, выровненные по положению с соответствующими значениями во втором списке.

+0

Звучит как хороший пример использования для python [tuple] (https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences). Рассматривали ли вы использование одного «списка» из 2-предметов «кортежей»? Таким образом, когда вы переставляете первый элемент в каждом кортеже, ваш 'list' будет поддерживать правильный порядок для всех вторых элементов. – huu

+0

В каких отношениях есть списки со словарем? Я не совсем понимаю, что вы спрашиваете –

+0

Я думаю, что понятие словаря - это то, как OP хочет концептуализировать связь двух списков. Проблема в том, что словарь не может повторять ключи, поэтому на практике это не сработает. Я считаю, что ОП задает вопрос о том, как создать такое гипотетическое отображение, а затем сохранить его при перестановке ключей. – huu

ответ

0

Как и другие люди ниже вашего поста, я не совсем понимаю вашу проблему (вы могли бы быть более конкретным о связи вы хотите получить?), Но, возможно, zip является ответом на ваш вопрос:

>>> a = [5,6,6,6,6,1,1,1,1,1,1,2,2,2,2,1] 
>>> b = [13,14,15,16,17,10,11,12,12,13,14,13,14,15,16,17] 
>>> alignment = zip(a, b) 
>>> alignment 
[(5, 13), (6, 14), (6, 15), (6, 16), (6, 17), (1, 10), (1, 11), (1, 12), (1, 12), (1, 13), (1, 14), (2, 13), (2, 14), (2, 15), (2, 16), (1, 17)] 

Отредактировано:

key_list = [5,6,6,1,6,1,6,1,1,2,1,2,1,2,2,1] 
values_list = [13,14,15,10,16,11,17,12,12,13,13,14,14,15,16,17] 
zipped_lists = zip(key_list, values_list) 
sorted_zip = sorted(zipped_lists) 
pattern = [5,6,6,6,6,1,1,1,1,1,1,2,2,2,2,1] 
temp_dict = {} 
for key, value in sorted_zip: 
    if key not in temp_dict: 
     temp_dict[key] = [value] 
    else: 
     temp_dict[key].append(value) 

final_list = [] 
for i in pattern: 
    final_list.append((i, temp_dict[i].pop(0))) 

И, конечно же, final_list ваш результат.

+0

Спасибо, у вас есть идея, где я пытаюсь это понять, и почему идея словаря не сработала, но на самом деле у меня нет списка, который вы назвали b, а не в этом порядке. У меня есть только 3 списка. Итак, если я заархивирую первые 2 списка вместе, как я могу использовать свой 3-й список, чтобы их переставить, как ваш zip-список? –

+0

@AnneIzy Проверьте это изменение, если я хорошо вас понял, это будет решение. Я предположил, что в группе ключей (а по группе я имею в виду 1 и ее значения, 2 и ее значения, 5 ... и т. Д.) Значения в некотором роде монотонны. Я не уверен, что это то, что вы на самом деле привыкли, но это работает для этого случая. – erhesto

+0

Кстати, на самом деле это была действительно хорошая проблема. Я не знаю, является ли это оптимальным решением для задач такого типа, но с моими современными алгоритмическими навыками я не могу найти лучшего. – erhesto

Смежные вопросы