создать список на основе значений в двух других списках - PullRequest
0 голосов
/ 16 октября 2018

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

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?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Использование списка понимания

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 голосов
/ 16 октября 2018

Вы можете использовать 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 голосов
/ 16 октября 2018

Сначала вы должны создать словарь первого массива кортежа с ключом в качестве второго значения и значением в качестве кортежа.Это имеет 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)]
0 голосов
/ 16 октября 2018

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

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 только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...