Найти и заменить элементы списка в Python 3.0? - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть 3 больших списка L0, L1 и L2 с 106756, 106588 и 100 словами соответственно.

L0 и L1, состоящие из данных, разбитых на токены слови L2, состоящий из слов, общих для списков L0 и L1.

Предположим, что

L1 = ['newnes', 'imprint', 'elsevier', 'corporate', 'drive', 'suite',
     'burlington', 'usa', 'linacre', 'jordan', 'hill', 'oxford', 'uk', 
     'elsevier', 'inc', 'right', 'reserved', 'exception', 'newness', 'uk', ...]

L2 = ['usa', 'uk', 'hill', 'drive', ... ]

Как видно из списка L1, естьrepetition of the words как 'newness', 'uk'.

Что мне нужно, так это то, что для каждого discovered (found) слова в L2, например (например, 'newness', 'uk'), мне нужно заменить его на modified injected form, как добавление special character или в start или end position этого обнаруженного слова.Далее для всех экземпляров обнаруженного слова (в L2) следует заменить измененную версию того же слова в L1.Например,

Предположим, слово newness встречалось 100 раз в L1 списке (скажем), а новизна - это слово, также присутствующее в L2.Точно так же есть 100 слов в L2, которые также присутствуют в L1, с несколькими частотами.

Тогда после преобразования список должен выглядеть примерно так:

newness ------> $newness$

uk -----------> $uk$ 

...

Как этого добиться в списке?Помогите, пожалуйста.Я также новичок в питоне.Мне просто интересно узнать, существует ли какая-либо команда в python для достижения этой цели?Я не знаю с чего начать?

1 Ответ

0 голосов
/ 15 сентября 2018

Для подсчета вещей в списке python предоставляет в своем коллекционном модуле класс Counter-), похожий на dict: Doku , который считает вхождения в O (n) и предоставляет их в виде словаря.

from collections import Counter


L1 = ['newnes', 'imprint', 'elsevier', 'corporate', 'drive', 'suite',
     'burlington', 'usa', 'linacre', 'jordan', 'hill', 'oxford', 'uk', 
     'elsevier', 'inc', 'right', 'reserved', 'exception', 'newness', 'uk', ...]

L2 = ['usa', 'uk', 'hill', 'drive', ... ]


c = Counter(L1)
print(c)

Выход:

Counter({'elsevier': 2, 'uk': 2, 'newnes': 1, 'imprint': 1, 'corporate': 1, 
         'drive': 1, 'suite': 1, 'burlington': 1, 'usa': 1, 'linacre': 1, 
         'jordan': 1, 'hill': 1, 'oxford': 1, 'inc': 1, 'right': 1, 'reserved': 1,
         'exception': 1, 'newness': 1, Ellipsis: 1})

Предоставляет удобный метод для сортировки результата в виде списка кортежей (key, count) с именем most_common () - если вы используете первое, вы получаете наиболее используемое слово, которое вы можете использовать вместе с понимание списка для изменения вашего списка источников:

word,_ = c.most_common()[0]  # get word mos often used

# inplace modification of L1
L1[:] = [ x if x != word else "#"+word+"#" for x in L1] # use x if not the most used word
L2[:] = [ x if x != word else "#"+word+"#" for x in L2] # else pre-/append #

print(L1)
print(L2)

Выход:

['newnes', 'imprint', '#elsevier#', 'corporate', 'drive', 'suite', 'burlington', 
 'usa', 'linacre', 'jordan', 'hill', 'oxford', 'uk', '#elsevier#', 'inc', 
 'right', 'reserved', 'exception', 'newness', 'uk', Ellipsis]

['usa', 'uk', 'hill', 'drive', Ellipsis]

Порядок элементов в Counter относится к порядку в исходном списке, вы получили несколько элементов со счетом 2 в L1 - elsevier - первый из них, следовательно, он также первый, когда используя most_common()


Редактировать 4 комментария:

from collections import Counter

L1 = ['newnes', 'imprint', 'elsevier', 'corporate', 'drive', 'suite',
     'burlington', 'usa','imprint', 'linacre', 'jordan', 'hill', 'oxford', 'uk','uk', 
     'elsevier', 'inc', 'right', 'reserved','imprint', 'exception', 'imprint','newness', 'uk', "..."]

L2 = ['usa', 'uk', 'hill', 'drive', "..."]


c = Counter(L1) 


substs = "#*+~-:;=)(/&%$§!"
i = 0
for word,count in c.most_common():
    temp = substs[i]*count # use the i-th char as substitute, apply it count times
    L1[:] = [ x if x != word else temp+word+temp for x in L1] # use x if not the most used word
    L2[:] = [ x if x != word else temp+word+temp for x in L2] # else pre-/append #
    i += 1
    i = i % len(substs) # wrap around

print(L1)
print(L2)

Выход:

['~newnes~', '####imprint####', '++elsevier++', '-corporate-', ':drive:', ';suite;', 
 '=burlington=', ')usa)', '####imprint####', '(linacre(', '/jordan/', '&hill&', 
 '%oxford%', '***uk***', '***uk***', '++elsevier++', '$inc$', '§right§', '!reserved!', 
 '####imprint####', '#exception#', '####imprint####', '*newness*', '***uk***', 
 '+...+']

[')usa)', '***uk***', '&hill&', ':drive:', '+...+']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...