[英]How to split a list of numbers based on the distance of consecutive elements in Python?
[英]How to group elements of a list in python based on their distance from other elements?
我有一個數字列表。 我想將彼此相距4以內的數字分組。 例如,如果我有一個列表[1,34,45,34,66,35,14,3,5,12,4,62,31,4,13,12]
。 我想將時尚元素分組為"1 3 5 4 4 ;34 34 35 31 ;45 ;66 62 ;14 12 13 12 ;"
. 說清楚:
Input >> [1,34,45,34,66,35,14,3,5,12,4,62,31,4,13,12]
Output >> 1 3 5 4 4 ;34 34 35 31 ;45 ;66 62 ;14 12 13 12 ;
為此,我編寫了以下代碼:
arr = [1,34,45,34,66,35,14,3,5,12,4,62,31,4,13,12]
bucket = ''
while arr != []:
element = arr.pop(0)
bucket += (str(element) + ' ')
for term in arr:
if abs(element-term)<= 4:
bucket += (str(term) + ' ')
arr.remove(term)
print(bucket)
print(arr)
else:
bucket += ';'
print(arr)
print(bucket)
我預計最終輸出如下:
1 3 5 4 4 ;34 34 35 31 ;45 ;66 62 ;14 12 13 12 ;
但我在最終輸出中得到的是:
1 3 4 4 ;34 34 35 31 ;45 ;66 62 ;14 12 12 ;5 ;13 ;
這里的元素 '5' 應該在第一個桶中,但在輸出中它不在它應該在的桶中。 同樣,“13”也不合適
任何幫助識別代碼中的問題將不勝感激。
問題是您沒有考慮在這些術語之前刪除元素,例如當您刪除 3 term 時位於第 7 個位置 (term=6) arr = [34,45,34,66,35,14,5,12, 4,62,31,4,13,12] ^5 變為第 7 位,但 term 繼續遞增,因此它跳過 5 嘗試在退出 for 循環之前使 term=term-1
當您到達列表中的元素 5 和 13 時,范圍為 4 的其他元素已經全部刪除並放入桶中,這就是為什么您為剩余的兩個元素獲得新桶的原因。
也許最好使用存儲桶的列表來檢查每個新元素是否在 4 到存儲桶中的每個其他元素的范圍內,然后添加它。 這樣,您就可以避免原始列表中沒有足夠的元素。
您在迭代列表時從列表中刪除元素,這會導致一些奇怪的跳過行為。 您可能會注意到,每次執行arr.remove(term)
,都會跳過下一個元素。 5 被跳過了,因為在它之前有一個 3。 同樣,在應該將 13 分配給第 5 組時,它被跳過了,因為它前面是 12(在它們之間的 4、62、31、4 已經被刪除之后)。
這里有一些解釋: 在迭代時從列表中刪除項目時出現奇怪的結果 [重復]和這里: 如何在迭代時從列表中刪除項目? .
我相信這應該可以達到您想要的結果(盡管您仍然需要格式化輸出):
def group_numbers(numbers, max_difference=4):
groups = []
for number in numbers:
found_group = False
for group in groups:
for member in group:
if abs(member - number) <= max_difference:
group.append(number)
found_group = True
break
# remove this if-block if a number should be added to multiple groups
if found_group:
break
if not found_group:
groups.append([number])
return groups
print(group_numbers([1,34,45,34,66,35,14,3,5,12,4,62,31,4,13,12]))
輸出: [[1, 3, 5, 4, 4], [34, 34, 35, 31], [45], [66, 62], [14, 12, 13, 12]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.