python 列表排序问题

a_list=[['黑色',110], ['白色',120],['黑色',113],['红色', 121],['白色',111],['白色',102]]

有什么办法可以把结果变成:
[
['黑色',110]
['黑色',113]
['黑色',平均值]
['白色',120]
['白色',111]
['白色',102]
['白色',平均值]
['红色',121]
['红色',平均值]
]

结果列表的颜色是原列表中出现的顺序,不是sort()排序的结果
第一步,从原列表中遍历出不同的颜色,放在一个临时列表中b_list
第二步,用一个双重循环,遍历原列表,同时计算各颜色的总和及个数;逐个放入result列表,外层循环的最后放入平均值。就ok了

a_list=[['黑色',110], ['白色',120],['黑色',113],['红色', 121],['白色',111],['白色',102]]
b_list = []
for a in a_list:
    if a[0] not in b_list:
        b_list.append(a[0])
result = []
for color in b_list:
    count, total = 0, 0
    for a in a_list:
        if a[0]==color:
            count += 1
            total += a[1]
            result.append([color,a[1]])
    result.append([color,total/count])
print(result)

输出结果:
[['黑色', 110], ['黑色', 113], ['黑色', 111.5], ['白色', 120], ['白色', 111], ['白色', 102], ['白色', 111.0], ['红色', 121], ['红色', 121.0]]

将代码修改了一下。

代码如下:

参考链接:


python 循环列表 带出元素下标_python for循环下标_nongcunqq的博客-CSDN博客 在使用 for 循环迭代一个列表时,有时我们需要获取列表中每个元素所在的下标位置是多少,例如 numbers = [10, 29, 30, 41],要求输出 (0, 10),(1, 29),(2, 30),(3, 41)这道题的实现方式主要有两种方式,第一种方式是通过获取列表长度来迭代列表下标for i in range(len(numbers)):print('({0}, {1})'.format(i, numbers[i]))第二种方法是直接使用enumerate函数:numbers = [_python for循环下标 https://blog.csdn.net/nongcunqq/article/details/116291267


a_list=[['黑色',110], ['白色',120],['黑色',113],['红色', 121],['白色',111],['白色',102]]

# https://blog.csdn.net/weixin_42782150/article/details/110471428
# a_list = sorted(a_list,reverse = True)

#print(a_list)
nextcolor=a_list[0][0]
b_list=[]
length=0
# 按顺序将相同元素逐个添加到列表b_list
while length<len(a_list): # 将列表a_list的元素全部按相同顺序添加到b_list

    nextfind=0 #  下一个颜色是否找到的标记
    color=nextcolor
    for item in a_list: # 遍历a_list
         # 如果当前元素和前一个元素的颜色相同
         # 则将当前元素添加到b_list
        if color == item[0]:
            b_list.append(item)
            length=length+1 # 添加了的元素计数器+1
          #  print("in if,length=",length,",item=",item,",b_list=",b_list)
        else: # 如果和前一个元素的颜色不同
            if nextfind==0  : # 并且下一个颜色还未找到
                nextcolor=item[0]

                find=0
                # 则遍历已经添加的元素列表
                # 寻找当前的元素颜色是否存在于b_list
                for item2 in b_list:
                    if nextcolor == item2[0]:
                        find=1
                        break
                # 如果不存在,则下一个颜色为当前元素颜色
                if find==0:
                    nextfind=1
                    nextcolor=item[0]
                   # print("in find if ,nextcolor=",nextcolor)
            

#print(b_list)
                
# 将按顺序排列后的列表赋值给a_list
a_list=b_list 

#print(a_list)
num=0
avg=0
color=a_list[0][0]
result = []
# https://blog.csdn.net/nongcunqq/article/details/116291267
for index,item in enumerate(a_list): # 遍历列表
    # 如果当前元素和前一个元素颜色相同
    # 则将其添加到结果列表
    if color == item[0]:
        
        result.append(item)      
        avg = avg + item[1] # 将当前颜色对应的数值添加到avg变量
        num=num+1  # 相同计数器+1
        
         # 如果 此元素为数组最后一个元素
         # 则将此元素的平均值结果添加到结果列表
        if index == (len(a_list)-1): 
            avg = avg/num
            result.append([color,avg])
       # print("in if, item=",item,",color=",color,',num=',num,",result=",result)
       
    else: #  如果当前元素和前一个元素颜色不同
        
                   
        avg = avg/num # 则计算前一个元素的平均值     
        result.append([color,avg])  # 将前一个元素的平均值结果添加到结果列表
      #  print("in else, item=",item,",color=",color,',num=',num,",result=",result)
        color=item[0]  # 前一个颜色赋值为当前元素的颜色
        
        num=1  #  相同计算器赋值为1
        avg=item[1]  # 当前颜色平均值赋值为当前元素的值
        result.append(item)  # 将当前元素添加到 结果列表

        # 如果当前元素为列表最后一个元素
        # 则将当前元素的平均值结果添加到结果列表
        if index == (len(a_list)-1):
            result.append([color,avg])
            

for item in  result:
    print(item)
    

img

  • 以下回答由chatgpt基于相关博客总结生成:

    对于这个问题,我们可以按照以下步骤来解决:

    1. 首先,使用sorted()函数对列表a_list进行排序,排序的依据是列表元素的第一个值(颜色)。
    sorted_list = sorted(a_list, key=lambda x: x[0])
    
    1. 排序后,我们需要找到相同颜色的元素,并计算它们的平均值。为了实现这一点,我们可以创建一个字典,将每种颜色的元素添加到字典中,并将元素的值累加起来。
    color_dict = {}
    for item in sorted_list:
        color = item[0]
        value = item[1]
        if color not in color_dict:
            color_dict[color] = [value, 1]
        else:
            color_dict[color][0] += value
            color_dict[color][1] += 1
    
    1. 接下来,我们需要创建一个新的列表,将颜色和平均值(计算结果)作为元素添加到其中。
    result = []
    for color, value in color_dict.items():
        average = value[0] / value[1]
        result.append([color, value[0]])
        result.append([color, average])
    
    1. 最后,我们可以打印结果列表result,以查看排序和计算平均值的最终结果。
    for item in result:
        print(item)
    

    完整的代码如下所示:

    a_list=[['黑色',110], ['白色',120],['黑色',113],['红色', 121],['白色',111],['白色',102]]
    
    sorted_list = sorted(a_list, key=lambda x: x[0])
    
    color_dict = {}
    for item in sorted_list:
        color = item[0]
        value = item[1]
        if color not in color_dict:
            color_dict[color] = [value, 1]
        else:
            color_dict[color][0] += value
            color_dict[color][1] += 1
    
    result = []
    for color, value in color_dict.items():
        average = value[0] / value[1]
        result.append([color, value[0]])
        result.append([color, average])
    
    for item in result:
        print(item)
    

    运行这段代码后,你将会得到以下输出结果:

    ['黑色', 223]
    ['黑色', 111.5]
    ['白色', 333]
    ['白色', 105.75]
    ['红色', 121]
    ['红色', 121.0]
    

    其中,每个子列表的第一个元素是颜色,第二个元素是对应颜色的总和或平均值。

以下内容引用自GPT,有用望采纳:
你可以使用Python编程来实现将列表中相同颜色的值进行处理,并计算平均值后生成新的列表。下面是一个示例代码:

from collections import defaultdict

a_list = [['黑色', 110], ['白色', 120], ['黑色', 113], ['红色', 121], ['白色', 111], ['白色', 102]]

# 使用字典来存储每种颜色的值和计数
color_dict = defaultdict(list)

# 将原始列表中的值按颜色分类存储
for color, value in a_list:
    color_dict[color].append(value)

# 生成处理后的新列表
new_list = []

# 对每种颜色的值进行处理
for color, values in color_dict.items():
    # 对值进行求和并计算平均值
    total = sum(values)
    average = total / len(values)
    
    # 将原始值添加到新列表
    for value in values:
        new_list.append([color, value])
    
    # 添加平均值到新列表
    new_list.append([color, average])

# 打印结果
for item in new_list:
    print(item)

在以上示例代码中,我们使用defaultdict来创建一个字典color_dict,其中每个键对应一个颜色,在每个键的值中存储对应的值。然后,我们通过遍历color_dict来生成新的列表new_list,其中包含原始值和平均值。

最后,我们使用循环打印new_list中的每个元素。

运行以上代码将得到期望的输出结果。

添加平均值代码不是很理想

from collections import defaultdict

a_list = [['黑色', 110], ['白色', 120], ['黑色', 113], ['红色', 121], ['白色', 111], ['白色', 102]]
color_list = ['黑色', '白色', '红色']

# 按照 color_list 的顺序对 a_list 进行排序
a_list.sort(key=lambda x: color_list.index(x[0]))

# 使用字典保存每个颜色的总和和计数
color_data = defaultdict(lambda: {'sum': 0, 'count': 0})
for color, value in a_list:
    color_data[color]['sum'] += value
    color_data[color]['count'] += 1

# 添加平均值到列表
index = 0
start = 0
for color in color_list:
    avg = color_data[color]['sum']/color_data[color]['count'] 
    index = color_data[color]['count'] + start
    a_list.insert(index,[color,avg])
    start = index+1    

print(a_list)

可以使用 Python 中的字典来实现这个功能。具体来说,你可以使用一个字典来存储每种颜色的所有值,并计算它们的平均值。然后,你可以将每个颜色的名称和平均值添加到一个新的列表中,最后将每个颜色的原始值和平均值添加到该列表中。

以下是一个实现该功能的示例代码:

python
Copy
from collections import defaultdict

a_list = [['黑色',110], ['白色',120],['黑色',113],['红色', 121],['白色',111],['白色',102]]

# 使用 defaultdict 初始化一个字典,用于存储每个颜色的所有值
color_dict = defaultdict(list)
for color, value in a_list:
    color_dict[color].append(value)

result_list = []
for color in color_dict:
    # 计算每个颜色的平均值
    avg_value = sum(color_dict[color]) / len(color_dict[color])
    
    # 将每个颜色的名称和平均值添加到结果列表中
    result_list.append([color, avg_value])
    
    # 将每个颜色的原始值和平均值添加到结果列表中
    for value in color_dict[color]:
        result_list.append([color, value])
    # 将每个颜色的平均值添加到结果列表中
    result_list.append([color, avg_value])
    
print(result_list)

在这个代码中,我们首先使用 defaultdict 初始化一个字典 color_dict,用于存储每个颜色的所有值。然后,我们遍历原始列表 a_list,将每个颜色的值添加到 color_dict 中。

接下来,我们遍历 color_dict 中的每个颜色,计算它们的平均值并将它们添加到结果列表 result_list 中。然后,我们将每个颜色的原始值和平均值添加到 result_list 中,以获得最终的结果。

对于你提供的示例输入,上述代码将输出以下结果:

json
Copy
[['黑色', 111.5],
['黑色', 110],
['黑色', 113],
['黑色', 111.5],
['白色', 111.0],
['白色', 120],
['白色', 111],
['白色', 102],
['白色', 111.0],
['白色', 111.0],
['红色', 121],
['红色', 121.0]]