在Python中区分Equal List项的最佳方法

时间:2013-06-28 16:40:39

标签: python list equality

对于此列表:

['a','a','a,'b','b','c']

我想:

['a1','a2','a3','b1','b2','c']

目的是获取包含不同项目的列表。 (len(set(my_list)) == len(my_list)

可以假设列表已排序。

并非每件商品都必须出现多次(例如“c”,在这种情况下请保留)

有很多方法可以做到这一点,我没想到'pythonic'。

6 个答案:

答案 0 :(得分:4)

使用collections.Counteritertools.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']

以上将为所有值生成唯一的名称,只要您不介意为每个字符串设置不同的数字(例如,如果b11,则不会有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)]