создать список на основе значений в двух других списках

1

Предположим, что у меня есть два списка, которые выглядят следующим образом:

A = [(1,4), (5,2), (10, 8), (11, 3), (59, 14)]
B = [4, 2, 3, 4, 8, 14, 4, 2]

Я хочу создать новый список под названием C на основе списка A и списка B чтобы C выглядел следующим образом:

C = [(1,4), (5,2), (11,3), (1,4), (10,8), (59,14), (1,4), (5,2)]

То есть, я хочу связать каждое значение в B с первым значением в соответствующем кортеже в A на основе второго значения в кортеже.

Я думаю, что могу сделать это с помощью цикла for следующим образом:

C  = []
    for tuple in A:
        for number in B:
            if number == tuple[1]:
                C.append(tuple)

но я не думаю, что это будет очень эффективно для больших списков.

Вопрос: Существует ли более эффективный способ создания списка C?

Спасибо!

Теги:
list
python-3.x

4 ответа

2
Лучший ответ

Вы можете сделать следующее:

A = [(1,4), (5,2), (10, 8), (11, 3), (59, 14)]
B = [4, 2, 3, 4, 8, 14, 4, 2]

a = {t[1]: t for t in reversed(A)}  # reverse to guarantee first tuple for each key
# {14: (59, 14), 3: (11, 3), 8: (10, 8), 2: (5, 2), 4: (1, 4)}

C = [a[x] for x in B]
#[(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]

Вы создаете сопоставление от вторых значений до первого tuple в A и используете это в понимании. Это гарантирует, что вы будете повторять как A и B только один раз.

  • 0
    Или reversed(A) для сто раз более читаемой альтернативы A[::-1] .
1

Вы можете использовать dict для сопоставления второго элемента в кортеже с первым, а затем использовать сопоставление для создания C:

d = {b: a for a, b in A}
C = [(d[k], k) for k in B]

C станет:

[(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]
0

Использование учета списков

C = [(*[j[0] for j in A if j[1] == i], i) for i in B] 
# [(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]
0

Сначала вы должны создать словарь первого массива кортежей с ключом в качестве второго значения и значения в качестве кортежа. Это временная сложность O (N). Теперь, когда вы зацикливаете его на втором массиве чисел, вы можете получить доступ к словарю с временной сложностью O (1). Таким образом, общая временная сложность всей программы будет O (N) + O (M), где N - длина кортежа, а M - длина массива

A = [(1,4), (5,2), (10, 8), (11, 3), (59, 14)]
B = [4, 2, 3, 4, 8, 14, 4, 2]

X = {}
for element in A:
    X[element[1]] = element

# X = {4: (1, 4), 2: (5, 2), 8: (10, 8), 3: (11, 3), 14: (59, 14)}
C = []
for element in B:
    C.append(X[element])

print(C)
# [(1, 4), (5, 2), (11, 3), (1, 4), (10, 8), (59, 14), (1, 4), (5, 2)]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню