我有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'
),我需要用其{{1 }}就像在发现的单词的modified injected form
或special character
start
处附加end
一样。
此外,对于发现的单词(在position
中的所有实例,应替换为L2
中相同单词的修改版本。例如,
假设L1
一词在newness
列表(例如)中出现了100次,而新颖性也是L1
中一个词。类似地,L2
中也有100个单词,而L2
中也有100个单词,具有多个频率。
然后,转换后的列表应如下所示:
L1
...
如何在列表中实现?请帮助。我也是python的新手。我只是想知道python中是否存在一些命令来实现这一目标?我不知道从哪里开始?
答案 0 :(得分:2)
要计算列表中的内容,python在其collections模块中提供了类似dict的Counter()类: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})
它提供了一种方便的方法来将结果排序为名为most_common()的元组(key, count)
的列表-如果使用第一个,则会得到使用最多的单词,可以将其与列表一起使用理解以修改您的源列表:
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
中项目的顺序与原始列表中的顺序有关,您在L1
中获得了2个计数为2的多个项目-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:', '+...+']