Менять только дубликаты, но не оригинальные - PullRequest
0 голосов
/ 18 марта 2020

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

c = 'Paul is 28 years old. Mary is 30 years old. Paul is a lawyer. Mary is a doctor'
lst = c.split(' ')
d = {'Paul': 'Thomas','Mary':'Smith' }

for key,value in d.items():
    for i in range(0, len(lst)):
        if lst[i] in d.keys():
            lst[i] = d.get(lst[i])

print(lst)

out: ['Thomas', 'is', '28', 'years', 'old.', 'Smith', 'is', '30', 'years', 'old.', 'Thomas', 'is', 'a', 'lawyer.', 'Smith', 'is', 'a', 'doctor']

Но я хочу что-то вроде этого

['Paul', 'is', '28', 'years', 'old.', 'Mary', 'is', '30', 'years', 'old.', 'Thomas', 'is', 'a', 'lawyer.', 'Smith', 'is', 'a', 'doctor']

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы должны отслеживать, видели ли вы имя раньше. И ваш код может использовать много упрощений:

c = 'Paul is 28 years old. Mary is 30 years old. Paul is a lawyer. Mary is a doctor'
lst = c.split(' ')
d = {'Paul': 'Thomas','Mary':'Smith' }
seen = set()

for i, name in enumerate(lst):
    if name in d:
        if name in seen:
            lst[i] = d[name]
        else:
            seen.add(name)
print(lst)

Отпечатки:

['Paul', 'is', '28', 'years', 'old.', 'Mary', 'is', '30', 'years', 'old.', 'Thomas', 'is', 'a', 'lawyer.', 'Smith', 'is', 'a', 'doctor']

См. Python Демо

0 голосов
/ 18 марта 2020

Вы также можете сделать это, не отслеживая увиденные слова:

c = 'Paul is 28 years old. Mary is 30 years old. Paul is a lawyer. Mary is a doctor'
lst = c.split(' ')
d = {'Paul': 'Thomas','Mary':'Smith' }

for i, w in enumerate(lst):
    if w in d.keys() and lst.index(w) != i:
        lst[i] = d.get(w)

print(lst)

Вывод:

['Paul', 'is', '28', 'years', 'old.', 'Mary', 'is', '30', 'years', 'old.', 'Thomas', 'is', 'a', 'lawyer.', 'Smith', 'is', 'a', 'doctor']

Или, что еще лучше, вы можете заменить l oop этим списком понимание:

[d.get(w) if w in d.keys() and lst.index(w) != i else w for i, w in enumerate(lst)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...