我有一个Python列表,并且只有一个元素重复三次。我想用独特的元素替换它们。
my_list = [,...,'future_use',...,'future_use',..'future_use',...]
预期o / p:
[,...,'future_use1',...,'future_use2',..'future_use3',...]
我尝试使用列表理解:
count = my_list.count("future_use")
for i in range(1, count+1):
my_list = [item.replace("future_use","future_use%r" %i,i) for item in my_list]
然而,我没有得到理想的输出。是否有人指出我正确的程序?
答案 0 :(得分:4)
您可以使用集合中的Counter
和defaultdict
以及来自itertools的count
来缩短它们;是否更清楚取决于你花在Python上的时间。像这样的模式经常使用,并且值得熟悉..
(python 3.6 style,使用f-strings)
from collections import Counter, defaultdict
import itertools
seq = ["a", "future_use", "b", "b", "future_use", "c", "future_use"]
counts = Counter(seq)
suffix_counter = defaultdict(lambda: itertools.count(1))
seq2 = [elem if counts[elem] == 1 else elem + f'_{next(suffix_counter[elem])}'
for elem in seq]
给了我
>>> seq2
['a', 'future_use_1', 'b_1', 'b_2', 'future_use_2', 'c', 'future_use_3']
答案 1 :(得分:2)
以下是一般方法:
my_list = ['foo', 'foo', 'whatever', 'whatever', 'nevermind', 'foo']
new_list = []
counts = {}
for el in my_list:
temp_count = counts.get(el, 0) + 1
counts[el] = temp_count
if temp_count == 1 and my_list.count(el) == 1:
new_list.append(el)
else:
new_list.append(el + str(temp_count))
print(new_list) # ['foo1', 'foo2', 'whatever1', 'whatever2', 'nevermind', 'foo3']
相当慢,但很简单。
UPD
调整@ DSM的好答案,也可以按如下方式实现:
my_list = ['foo', 'foo', 'whatever', 'whatever', 'nevermind', 'foo']
from collections import Counter
ranges = {k:[str(i + 1) for i in range(v)] for k,v in Counter(my_list).items()}
new_list = [el if ranges[el] == ['1'] else (el + ranges[el].pop(0)) for el in my_list]
print(new_list) # ['foo1', 'foo2', 'whatever1', 'whatever2', 'nevermind', 'foo3']
答案 2 :(得分:1)
你可以尝试这个:
myList = ['future_use','future_use','future_use']
def makeUnique(myList, word):
counter = 1
for i in range(0,len(myList)):
if myList[i] == word:
myList[i] = word + str(counter)
counter = counter + 1
makeUnique(myList, 'future_use')
print(myList)
结果是:
['future_use1', 'future_use2', 'future_use3']
您可以将它用于列表中的每个字符串元素。
答案 3 :(得分:0)
试试这个:
i = 0
for j, item in enumerate(my_list):
if item == "future_use":
my_list[j] = "future_use" + str(i)
i += 1
答案 4 :(得分:0)
不要考虑更高效,更快,更全面的本机方法。
gulp.task('log', shell.task([
'git log -20 --pretty=format:"%h - %an, %ai : %s <br/>" > "valami.txt"'
]));
答案 5 :(得分:0)
也许在这里使用生成器有点矫枉过正,但它是一种有用的技术,可以知道你是否使用列表推导和生成器。
{{1}}