比较列表列表中的第一个元素并写入重复值的数量

时间:2016-03-22 10:29:40

标签: python python-2.7

我有一个列表如下:

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']]

我需要比较内部列表中的第一个值(此处为' 55'以及' 64')如果在其他列表中重复,则重复列表应该重复被删除。但是重复值的数量应该添加到第一个列表中。

所以,它应该是这样的:

shorten_fails = [['55','35325235432','log','3'], ['64','55','log3', '2']]

保留具有唯一值的第一个列表,并添加在第1个位置具有此值的列表数。

我试图通过循环来做到这一点,但最后我完成了for for for for for for ...而且我确定必须有一个更简单的方法来做到这一点

3 个答案:

答案 0 :(得分:2)

您可以使用Python的CounterOrderedDict功能,如下所示:

from collections import Counter, OrderedDict

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']]

v1_counts = Counter(v[0] for v in fails)
v1 = OrderedDict({v[0] : v for v in fails})
shorten_fails = [v + [v1_counts[k]] for k, v in v1.items()]

print shorten_fails

这将显示以下输出:

[['55', '3232432', 'log2', 3], ['64', '324234324', 'log2', 2]]

v1_counts包含所有值的计数,即

Counter({'55': 3, '64': 2})

v1保存每个值的最后一个条目,即

OrderedDict([('55', ['55', '3232432', 'log2']), ('64', ['64', '324234324', 'log2'])])

最后通过获取shorten_fails条目并将相应的计数器值附加到每个元素来构造v1

答案 1 :(得分:1)

fails = [['55','35325235432','log'], ['55','22222222','log'], ['55','3232432','log2'], ['64','55','log3'], ['64','324234324','log2']]

first_elems = set(fail[0] for fail in fails)
new_fails = []
for fail in fails:
    first = fail[0]
    if first in first_elems:
        new_fails.append(fail + [sum(f[0] == first for f in fails)])
        first_elems.remove(first)

print(new_fails)
# [['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]]

答案 2 :(得分:1)

您可以使用字典作为查找表来存储已添加到缩短列表中的元素的索引:

def shorten(fails):
    sf, ind = [], {}
    for el in fails:
        if el[0] in ind:
            sf[ind[el[0]]][-1] += 1
        else:
            ind[el[0]] = len(sf)
            sf.append(el + [1])
    return sf
>>> shorten(fails)
[['55', '35325235432', 'log', 3], ['64', '55', 'log3', 2]]

如果你真的希望计数器是一个字符串,你可以很容易地在最后转换最后一个列表元素。