如何增加列表并将某些值替换为其计数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何增加列表并将某些值替换为其计数相关的知识,希望对你有一定的参考价值。

我试图通过列表递增并将给定值的多次出现(按顺序)替换为它们发生的次数(作为粗略范围,出现1-3为小,4-6为中等,并且超过6次是很多次)。

我试图找到一个优雅的解决方案,并希望得到任何指导。我查看了itertools,但找不到合适的东西(我想)。

任何帮助将不胜感激。谢谢

例如:

testList = [1,2,2,1,1,2,1,4,1,2,2,2,2,1,2,2,2,2,2,2,2,2,2} ,1]

会变成

[1,“2次少量”,1,1次,“2次少量”,1,4,1,“2次中等次数”,1次,“2次大量次”]

testList = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]

listLocation = -1

newlist = []

for i in testList:

    listLocation += 1

    if i == 2:

        if testList[listLocation+1] == 2:

            testList[listLocation] = "2 multiple"

            newlist.append(testList[listLocation])

            testList.pop(listLocation+1)

    else:
        newlist.append(i)

newlist

这是我已经得到的,现在这只是检测到2在序列中多次出现多次并用字符串替换该序列,但我无法弄清楚如何从这个移动到一个实际的计数器范围和更优雅的代码风格(我确信有一种方法可以避免使用listLocation变量来跟踪列表索引)。此外,我无法弄清楚如何检测列表的结尾,因为如果它作为列表中的最后一个值命中2,它将崩溃。

非常感谢任何帮助,谢谢

答案

这是我的解决方案。首先,让我们定义一个函数,它返回一个要插入到列表中的消息:

def message(value, count):
    msg = '{value} {amount} amount of times'

    if 1 <= count <= 3:
        msg = msg.format(value=value, amount='small')
    elif 4 <= count <= 6:
        msg = msg.format(value=value, amount='medium')
    else:
        msg = msg.format(value=value, amount='large')

    return msg

其次,我们定义一个函数,它接受一个值列表和一个值作为其参数:

def counter(values, value):
    count = 0
    results = []

    for i, v in enumerate(values):

        if v != value:

            if count:
                results.append(message(value, count))
                count = 0

            results.append(v)
            continue

        count = count + 1

        if i < len(values) - 1:
            continue

        results.append(message(value, count))

    return results

结果如下:

>>> values = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
>>> counter(values, value=2)
[1,
 '2 small amount of times',
 1,
 1,
 '2 small amount of times',
 1,
 4,
 1,
 '2 medium amount of times',
 1,
 '2 large amount of times',
 1]
另一答案

以下是我认为这是一种简单的方法。

a = [1, 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1]
b = []
i=0
while  i<len(a) and i < len(a):
    if a[i]==2:
        n=i
        while a[i]==2:
            i+=1

        if (i-n)<4:
            b.append("2 small amount of times")
        elif (i-n)<6 and (i-n)>4:
            b.append("2 medium amount of times")
        else:
            b.append("2 large amount of times")                                                                                                                

    else:
        b.append(a[i])
        i+=1
print(b)

输出:

[1, '2 small amount of times', 1, 1, '2 small amount of times', 1, 4, 1, '2 large amount of times', 1, '2 large amount of times', 1]

如果您有任何疑问,请告诉我。

以上是关于如何增加列表并将某些值替换为其计数的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 groupby 对象中包含的多个列表并将该组列表中的每个值的计数相加

OnItemClick 如何从列表视图中获取单击项目的文本值

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?

如何从“活动”中的“编辑”文本中获取值并将其用于片段?

用片段替换某些东西

如何让我的列表读取某些值?