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

2024-05-12 20:29:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我的列表如下所示:

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']]

保留第一个具有唯一值的列表,并添加第一个位置具有该值的列表数。你知道吗

我试图做这个循环,但在最后我完成了为在为。。。我相信一定有更简单的方法


Tags: 方法log列表数量shortenlog2failslog3
3条回答

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

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]]

如果您真的希望计数器是一个字符串,那么可以很容易地对最后一个列表元素进行转换。你知道吗

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]]

您可以使用Python的^{}^{}特性,如下所示:

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条目并将相应的计数器值附加到每个元素来构造的。你知道吗

相关问题 更多 >