正在分析和计算 Python3 列表列表中的新值
Analysing and calculating new values in list of lists in Python3
好吧,我会尽量正确地解释自己:
我正在使用 python3 结构中的列表列表:
[[position, color, counts],...]
结果按颜色先排序,再按位置排序。
如果它们具有相同的颜色并且它们之间的位置最多为 +-2,我需要合并位置的计数和平均值。
一个简短的输入测试示例是:
[ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4] ]
预期输出:
[ [2.75, "red", 9], [3, "green", 9], [10, "green", 4]
我对 5 "red" 1 这样的情况特别有问题,因为如果我工作执行平均距离可以增加,但我想考虑它的实际情况前一个的2个位置...
有解决办法吗?
提前致谢!
这是一个可行的方法:
list = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4], [5, "green", 7], [2, "blue", 3], [4, "blue", 7] ]
color = list[0][1]
result_list = []
sum1, sum2 = 0, 0
count = 0
avg = 0
for item in list:
if color != item[1]:
avg = float(sum1)/float(count)
result_list.append([avg, color, sum2])
count = 1
color = item[1]
sum1, sum2 = item[0], item[2]
else:
count += 1
sum1 += item[0]
sum2 += item[2]
avg = float(sum1)/float(count)
result_list.append([avg, color, sum2])
print result_list
还有一个Fiddle
我想我答对了你的问题。这个片段应该可以工作,但它可能是可优化的:
colors = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4] ]
def avg(list):
return sum(list) / float(len(list))
def process(colors, threshold=2):
colors_combined = {}
colors_processed = []
# sort colors by their name
for color in colors:
position, color_name, count = color
if color_name not in colors_combined.keys():
colors_combined[color_name] = []
colors_combined[color_name].append([position, count])
# print colors_combined
# process the data
for color in colors_combined.keys():
data = colors_combined[color]
if len(data) == 1: # there can't be a case, where len(data) = 0
colors_processed.append([data[0], color, data[1]])
else: # more than 1 positions to check
last_position = data[0][0]
positions = [last_position]
count_combined = data[0][1]
for element in data[1:]:
if abs(last_position - element[0]) <= threshold: # element is inside of the distance
positions.append(element[0])
count_combined += element[1]
else:
colors_processed.append([avg(positions), color, count_combined])
positions = [element[0]]
count_combined = element[1]
last_position = element[0]
if len(positions) > 0: # the last processed elements where inside the distance, but not added
colors_processed.append([avg(positions), color, count_combined])
return colors_processed
print process(colors)
输出如下所示:
[[3.0, 'green', 9], [10.0, 'green', 4], [2.75, 'red', 9]]
如果您需要排序的结果,您可以添加颜色排序而不是 colors_combined.keys()
。
好吧,我会尽量正确地解释自己:
我正在使用 python3 结构中的列表列表:
[[position, color, counts],...]
结果按颜色先排序,再按位置排序。
如果它们具有相同的颜色并且它们之间的位置最多为 +-2,我需要合并位置的计数和平均值。
一个简短的输入测试示例是:
[ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4] ]
预期输出:
[ [2.75, "red", 9], [3, "green", 9], [10, "green", 4]
我对 5 "red" 1 这样的情况特别有问题,因为如果我工作执行平均距离可以增加,但我想考虑它的实际情况前一个的2个位置...
有解决办法吗?
提前致谢!
这是一个可行的方法:
list = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4], [5, "green", 7], [2, "blue", 3], [4, "blue", 7] ]
color = list[0][1]
result_list = []
sum1, sum2 = 0, 0
count = 0
avg = 0
for item in list:
if color != item[1]:
avg = float(sum1)/float(count)
result_list.append([avg, color, sum2])
count = 1
color = item[1]
sum1, sum2 = item[0], item[2]
else:
count += 1
sum1 += item[0]
sum2 += item[2]
avg = float(sum1)/float(count)
result_list.append([avg, color, sum2])
print result_list
还有一个Fiddle
我想我答对了你的问题。这个片段应该可以工作,但它可能是可优化的:
colors = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4] ]
def avg(list):
return sum(list) / float(len(list))
def process(colors, threshold=2):
colors_combined = {}
colors_processed = []
# sort colors by their name
for color in colors:
position, color_name, count = color
if color_name not in colors_combined.keys():
colors_combined[color_name] = []
colors_combined[color_name].append([position, count])
# print colors_combined
# process the data
for color in colors_combined.keys():
data = colors_combined[color]
if len(data) == 1: # there can't be a case, where len(data) = 0
colors_processed.append([data[0], color, data[1]])
else: # more than 1 positions to check
last_position = data[0][0]
positions = [last_position]
count_combined = data[0][1]
for element in data[1:]:
if abs(last_position - element[0]) <= threshold: # element is inside of the distance
positions.append(element[0])
count_combined += element[1]
else:
colors_processed.append([avg(positions), color, count_combined])
positions = [element[0]]
count_combined = element[1]
last_position = element[0]
if len(positions) > 0: # the last processed elements where inside the distance, but not added
colors_processed.append([avg(positions), color, count_combined])
return colors_processed
print process(colors)
输出如下所示:
[[3.0, 'green', 9], [10.0, 'green', 4], [2.75, 'red', 9]]
如果您需要排序的结果,您可以添加颜色排序而不是 colors_combined.keys()
。