在Python 3.0中查找和替换列表元素?

时间:2018-09-15 17:51:40

标签: python string python-3.x list replace

我有3个大列表L0L1L2,分别有106756、106588和100个字。

L0L1构成将数据标记化为单词的标记,而L2包含L0L1列表都通用的单词

假设,

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 formspecial character start处附加end一样。 此外,对于发现的单词(在position中的所有实例,应替换为L2中相同单词的修改版本。例如,

假设L1一词在newness列表(例如)中出现了100次,而新颖性也是L1中一个词。类似地,L2中也有100个单词,而L2中也有100个单词,具有多个频率。

然后,转换后的列表应如下所示:

L1

...

如何在列表中实现?请帮助。我也是python的新手。我只是想知道python中是否存在一些命令来实现这一目标?我不知道从哪里开始?

1 个答案:

答案 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:', '+...+']