簡體   English   中英

python用唯一數字替換列表中的元素

[英]python replace the elements in the list with unique numbers

我因找不到解決方案而遇到一些問題。

我有一個看起來像他的清單,實際上有60000個元素:

lst = [[0, [-24.75, -24.75, -25.0], 0.00001, 2],
[10, [-26, -26, -26], 0.00011, 4], 
[0, [-3, -200000, -25.0], 0.000009, 42], 
[0, [-4, -4.7, -5], 0.00801, 7], 
[1, [-3, -200000, -25.0], 0.00089, 8], 
[2, [-3, -200000, -25.0], 0.000899, 18]]

[lst[i][1] for i in range(len(lst))]元素[lst[i][1] for i in range(len(lst))]被認為是笛卡爾坐標,其中一些不止一次出現。

我想給每個坐標一個唯一的數字,這樣列表就變成了:

lst = [[0, 0, 0.00001, 2],
[10, 1, 0.00011, 4], 
[0, 2, 0.000009, 42], 
[0, 3, 0.00801, 7], 
[1, 2, 0.00089, 8], 
[2, 2, 0.000899, 18]]

這意味着,如果坐標[-3, -200000, -25.0]一次被替換為數字(此處為2 ),則此坐標的所有重復項也必須替換為相同的數字。

如果可以重新排列原始列表lst中的元素,也可以,主要要點是我需要將所有坐標三元組替換為數字。

先感謝您。

我們可以先構造一個defaultdict

from collections import defaultdict
from itertools import count

dispatcher = defaultdict(lambda c=count(0): next(c))

現在我們可以簡單地用查找替換。 現在,由於元素不可哈希,因此我們不能簡單地將它們添加到字典中。 但是我們可以將它們轉換為元組。

現在我們可以使用:

for lsti in lst:
    lsti[1] = dispatcher[tuple(lsti[1])]

對於給定的輸入,將生成:

>>> lst
[[0, 0, 1e-05, 2], [10, 1, 0.00011, 4], [0, 2, 9e-06, 42], [0, 3, 0.00801, 7], [1, 2, 0.00089, 8], [2, 2, 0.000899, 18]]

制作一個已經看過的值的字典。 對於列表中的每個項目,如果其坐標在該詞典中,請使用其保存的值。 否則,將該鍵插入字典並更新運行計數:

coordmap = {}
count = 0
for item in lst:
    coords = tuple(item[1])
    try:
        new_value = coordmap[coords]
    except KeyError:
        new_value = coordmap[coords] = count
        count += 1
    item[1] = new_value

元組是可哈希的。 您可以使用它很容易地維護已訪問坐標的字典。

import random  
seen = { }
i = 0
for l in lst:
    coord = tuple(l[1])
    if coord not in seen:
        seen[coord] = i
        i += 1

    l[1] = seen[coord]

內容:

[[0, 0, 1e-05, 2],
 [10, 1, 0.00011, 4],
 [0, 2, 9e-06, 42],
 [0, 3, 0.00801, 7],
 [1, 4, 0.00089, 8],
 [2, 5, 0.000899, 18]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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