Предположим, что у меня есть два списка, которые выглядят следующим образом:
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
?
Спасибо!
Вы можете сделать следующее:
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
только один раз.
Вы можете использовать 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)]
Использование учета списков
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)]
Сначала вы должны создать словарь первого массива кортежей с ключом в качестве второго значения и значения в качестве кортежа. Это временная сложность 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)]
reversed(A)
для сто раз более читаемой альтернативыA[::-1]
.