Как переместить элементы из lst1, присутствующие в lst2, в конец lst1 в Python? - PullRequest
0 голосов
/ 18 апреля 2020

Как я могу проверить, присутствуют ли определенные элементы из lst2 в lst1, и для всех элементов, которые есть, переместить их в конец lst1? Например, у меня есть lst1: «ананас», «яблоко», «апельсин», «банан», «груша» и lst2: «яблоко», «банан». Я хочу, чтобы lst1 стал: "ананас", "апельсин", "груша", "яблоко", "банан".

Сейчас я делаю это так:

f = open('bestuursleden.txt', 'r')
bestuur = f.read()
bestuur = " " + bestuur
bestuur = bestuur.split(",")
f.close()

f = open('namenlijst.txt', 'r')
studenten = f.read()
studenten = " " + studenten
studenten1 = studenten.split(",")
f.close()

studenten2 = sorted(studenten1, key=lambda x: x.split()[-1])

if ('apple' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('apple')))
if ('banana' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('banana')))
if ('orange' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('orange')))
if ('pineapple' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('pineapple')))
if ('raspberry' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('raspberry')))
if ('strawberry' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('strawberry')))
if ('watermelon' in studenten2):
    studenten2.append(studenten2.pop(studenten2.index('watermelon')))

studenten3 = (','.join(studenten2))
studenten3 = studenten3[1:]
f = open('Gesorteerde lijst.txt', 'w')
f.write(studenten3)
f.close()

Я думаю, что должен быть какой-то способ сделать это более эффективно.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Вот простой (хотя и не особенно эффективный) способ решения проблемы с использованием списочных представлений и соблюдением первоначального порядка:

lst1 = ["pineapple", "apple", "orange", "banana", "pear"]
lst2 = ["apple", "banana"]

head = [e for e in lst1 if e not in lst2]
tail = [e for e in lst1 if e in lst2]
lst1 = head + tail

Если вы хотите повысить производительность (и при этом соблюдать первоначальный порядок), используйте set:

intersect = set(lst1).intersection(lst2)
head = [e for e in lst1 if e not in intersect]
tail = [e for e in lst2 if e in intersect]
lst1 = head + tail

В любом случае, теперь lst1 будет:

["pineapple", "orange", "pear", "apple", "banana"]
1 голос
/ 18 апреля 2020

вы можете использовать:

lst1 = ["pineapple", "apple", "orange", "banana", "pear"]
lst2 =  ["apple", "banana"] # you may cast to set for performance

intersection = []
difference = []

for i in lst1:
    if i in lst2:
        intersection.append(i)
    else:
        difference.append(i)

difference.extend(intersection)
lst1 = difference
print(lst1)
# ['pineapple', 'orange', 'pear', 'apple', 'banana']
0 голосов
/ 18 апреля 2020

Имеет ли значение порядок 'pineapple', 'orange' and 'pear'? Если нет, то это можно сделать менее многословно:

lst1 = ["pineapple", "apple", "orange", "banana", "pear"]
lst2 =  ["apple", "banana"]

lst = list(set(lst1)-set(lst2))
lst.extend(lst2) ## ['orange', 'pear', 'pineapple', 'apple', 'banana']

Редактировать:

Поскольку порядок имеет значение, это также должно работать:

lst = (set(lst1)-set(lst2))
lst = [i for i in lst1 if i in lst] ## added
lst.extend(lst2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...