[英]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.