簡體   English   中英

python - 如何根據與其他元素的距離對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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM