簡體   English   中英

如何在 python 中的坐標對列表中迭代列表列表列表的列表?

[英]How to iterate over a list of list of lists of lists of lists… of list of pair of coordinates in python?

我正在嘗試遍歷列表列表的列表... python 中的坐標對列表,我想對這些坐標對中的每一個求和一個值,但我也想保留結構。

我認為一個例子的價值超過一千字,所以:

coordinates = [[[-15.418887, 28.180395], [-15.418887, 28.180395]],
 [[-15.794088, 28.018681], [-15.794088, 28.018681]]]

這是一個非常基本的例子,但不是真實的情況。 實際上,除了一對坐標之外,每個列表都有可變長度。 所以可能有 4 個列表,直到對坐標列表的列表,或者它可能是 3,它是可變的

我想為每個坐標添加 3(例如),但保持原始結構(我不想將列表列表變平....)

也許這對於嘗試回答問題很有用:

  • 我有一個 geojson 文件,我想將一個特征(一個區域)移動到另一個地方。 為此,我試圖將一個常數值與該區域的每個坐標的緯度和經度相加
  • 我認為這可以使用遞歸來完成,但我不確定如何

任何幫助表示贊賞。

coordinates = [[[-15.418887, 28.180395], [-15.418887, 28.180395]],
               [[-15.794088, 28.018681], [-15.794088, 28.018681]]]

def recursively_add3(l):
    if isinstance(l, float):
        return l
    
    for index, inner_list in enumerate(l):
        inner_result = recursively_add3(inner_list)
        if inner_result is not None:
            l[index] = inner_result + 3
    
    return None

recursively_add3(coordinates)

這給出了結果

[[[-12.418887, 31.180395], [-12.418887, 31.180395]]
, [[-12.794088, 31.018681], [-12.794088, 31.018681]]]

您可以使用遞歸 function 來處理一般情況。 只需檢查是否有列表並遞歸,否則返回加法的結果:

def add_to_list(l, n):
    if not isinstance(l, list):
        return l + n
    return [add_to_list(sub, n) for sub in l]
   
coordinates = [[[-15.418887, 28.180395], [-15.418887, 28.180395]],[[-15.794088, 28.018681], [-15.794088, 28.018681]]]

add_to_list(coordinates, 3)    
#[[[-12.418887, 31.180395], [-12.418887, 31.180395]], [[-12.794088, 31.018681], [[-12.794088, 31.018681]]]]

# A more general case:
add_to_list([1, [2, [5, [6]]], 3], 2)
# [3, [4, [7, [8]]], 5]

# Degenerate cases
add_to_list([], 2)
# []
add_to_list(5, 2) 
# 7

這假設您的嵌套數據將數字或列表。

一般map方法僅將 function 應用於隨機深度嵌套列表的最里面的元素:

def map_nested(fnc, lst):
    if not isinstance(lst, list):
        return fnc(lst)
    return [map_nested(fnc, x) for x in lst]
    # or for in-place mutation:
    # lst[:] = (map_nested(fnc, x) for x in lst)
    # return lst

add3 = lambda x: x+3

map_nested(add3, coordinates)
# [[[-12.418887, 31.180395], [-12.418887, 31.180395]], 
#  [[-12.794088, 31.018681], [-12.794088, 31.018681]]]

您正在使用坐標的 3D 向量(列表列表)對嗎? 那么你的循環應該是三倍以訪問該 3D 向量上的所有變量。

for x in list: #x is a list of lists
  for y in x: #y is a list
    for z in y: #z is a pair of coordinates
      #Your code here

暫無
暫無

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

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