对于此列表:
['a','a','a,'b','b','c']
我想:
['a1','a2','a3','b1','b2','c']
目的是获取包含不同项目的列表。 (len(set(my_list)) == len(my_list)
)
可以假设列表已排序。
并非每件商品都必须出现多次(例如“c”,在这种情况下请保留)
有很多方法可以做到这一点,我没想到'pythonic'。
答案 0 :(得分:4)
使用collections.Counter
和itertools.count
:
>>> from itertools import count
>>> from collections import Counter
>>> lis = ['a','a','a','b','b','c']
>>> c = Counter(lis)
>>> dic = {k: count(1) for k in c}
>>> [x + ( str(next(dic[x])) if c[x]>1 else '') for x in lis]
['a1', 'a2', 'a3', 'b1', 'b2', 'c']
使用itertools.groupby
和生成器功能:
>>> def solve(lis):
for k,g in groupby(lis):
le = list(g)
if len(le) > 1:
for i, x in enumerate(le, 1):
yield x+str(i)
else:
yield k
...
>>> list(solve(lis))
['a1', 'a2', 'a3', 'b1', 'b2', 'c']
答案 1 :(得分:1)
试试这个:
lst = ['a','a','a','b','b','c']
[ e + str(i) for i, e in enumerate(lst) ]
=> ['a0', 'a1', 'a2', 'b3', 'b4', 'c5']
以上将为所有值生成唯一的名称,只要您不介意为每个字符串设置不同的数字(例如,如果b1
是1
,则不会有from collections import Counter
lst = ['a','a','a','b','b','c']
c = Counter(lst)
reduce(lambda a, (k, v): a + ([k + str(i) for i in xrange(1, v+1)] if v > 1 else [k]), c.items(), [])
=> ['a1', 'a2', 'a3', 'c', 'b1', 'b2']
之前使用过)
修改强>
现在问题很清楚,这是另一种可能的解决方案,使用函数编程风格:
sort()
以上内容将更改输入列表中找到的原始订单,但如果这是一个问题,则简单的{{1}}会修复它。
答案 2 :(得分:1)
由于其他人都在推出自己的版本,因此我使用itertools.Counter
:
>>> counts = Counter(original_list)
>>> [k + (str(i+1) if ct > 1 else "") for k, ct in counts.iteritems() for i in xrange(ct)]
['a1', 'a2', 'a3', 'c', 'b1', 'b2']
请注意,原始列表顺序不会保留。
答案 3 :(得分:0)
L= ['a','a','a','b','b','c']
combined = list()
for item in set(L):
ocr = L.count(item)
if ocr > 1: combined += map(lambda x: item + str(x), range(1,ocr))
else: combined.append(item)
print combined
答案 4 :(得分:0)
您可以使用itertools和其他一些内置函数:
import itertools
data = ['a','a','a','b','b','c']
data_lists = [[y + str(x) for x, y in enumerate(it, 1)] for _, it in itertools.groupby(data)]
result = list(itertools.chain.from_iterable((item if len(item) > 1 else item[0][:-1]) for item in data_lists))
答案 5 :(得分:0)
这是一个单行...不高效或推荐!
鉴于输入:
A = ['a','a','a','b','b','c']
撰写输出:
result = [(x + str(A[:i].count(x)) if A.count(x) > 1 else x) for i, x in enumerate(A)]