Заказ списка на основе ключей из другого списка - PullRequest
0 голосов
/ 18 января 2020

Допустим, у нас есть список A, упорядоченный по какой-то функции, и другой список B, который должен служить ключом. Как я могу вернуть список, который сохраняет исходный порядок A, но со значениями B перед значениями не в B?

# Scenario I.
A = ['a','b','c','d']
B = ['b','d']
# Want to return: ['b','d','a','c']

# Scenario II.
A = ['a','b','c','d']
B = ['d','b']
# Want to return: ['b','d','a','c']

# Scenario III.
A = ['a','b','c','d']
B = ['d','c','b','a']
# Want to return: ['a','b','c','d']

Ответы [ 3 ]

0 голосов
/ 18 января 2020

Для каждого элемента в A, если он находится в B, поместите его в один список, в противном случае поместите его в другой список, а затем верните два списка вместе.

def prefer_b(a, b):
    """
    Return a list of items from "a" with the ones that are also in "b" first.

    >>> prefer_b('abcd', 'bd')
    ['b', 'd', 'a', 'c']
    >>> prefer_b('abcd', 'db')
    ['b', 'd', 'a', 'c']
    >>> prefer_b('abcd', 'dcba')
    ['a', 'b', 'c', 'd']
    """
    in_b, not_in_b = [], []
    for item in a:
        lst = in_b if item in b else not_in_b
        lst.append(item)
    return in_b + not_in_b
0 голосов
/ 18 января 2020

Я написал эту функцию, и она сработала для меня

def func(A,B):
    Z = [x for x in A if x not in B]

    return sorted(B) + Z

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

0 голосов
/ 18 января 2020

На самом деле, я думаю об этом. Примерно так будет работать, но, вероятно, не самый эффективный / элегантный способ:

C = [x for x in A if x in B] # Preserves order of A since it loops through one-by-one
D = [x for x in A if x not in B]
E = C + D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...