簡體   English   中英

從Python上的列表中刪除坐標

[英]Remove coordinates from lists on Python

這是我最后一個問題的后續問題: Python3 Numpy np.where Error

我有2個這樣的清單:

x = [None,[1, 15, 175, 20],
    [150, 175, 18, 20],
    [150, 175, 18],
    [192, 150, 177],...]


y = [None,[12, 43, 55, 231],
    [243, 334, 44, 12],
    [656, 145, 138],
    [12, 150, 177],
    [150, 177, 188],...]

我想刪除的x值低於30個y對應於移除值x的值。 (例如, x[1]y[1] (x,y) = (1,12)

為了做到這一點,我得到了更正的x列表:

In : [[v2 for v2 in v1 if v2>=30] for v1 in x[1:]]
Out: [[175], [150, 175], [150, 175], [192, 150, 177]]

我還得到了其余x值的坐標:

In : [(i,j) for i,v1 in enumerate(x[1:]) for j,v2 in enumerate(v1) if v2<30]
Out: [(0, 0), (0, 1), (0, 3), (1, 2), (1, 3), (2, 2)]

現在,我想使用這些坐標從y刪除項目。

我該如何實施?

new_y = []
for i in range(len(y)):
    new_y.append([y[i][j] for j in range(len(y[i])) if (i,j) not in BadList])

BadList在哪里

[(i,j) for i,v1 in enumerate(x[1:]) for j,v2 in enumerate(v1) if v2<30]

您可以使用zip使用

In [395]: [(a, b) for z in list(zip(x, y))[1:] for a, b in list(zip(*z)) if a >= 30]
Out[395]:
[(175, 55),
 (150, 243),
 (175, 334),
 (150, 656),
 (175, 145),
 (192, 12),
 (150, 150),
 (177, 177)]

這相當於

In [396]: v = []

In [398]: for z in list(zip(x, y))[1:]:
     ...:     for a, b in list(zip(*z)):
     ...:         if a >= 30:
     ...:             v.append((a,b))
     ...:

哪里

In [388]:  list(zip(x, y))[1:]
Out[388]:
[([1, 15, 175, 20], [12, 43, 55, 231]),
 ([150, 175, 18, 20], [243, 334, 44, 12]),
 ([150, 175, 18], [656, 145, 138]),
 ([192, 150, 177], [12, 150, 177])]

In [392]: list(zip(*list(zip(x, y))[1]))
Out[392]: [(1, 12), (15, 43), (175, 55), (20, 231)]

為了獲得校正后的y值,我建議完全繞過坐標作為第一種方法。 原因是您一路上可能會得到空列表,這會使您的輸出形狀變差,而不必特別跟蹤它們。 而且,刪除元素通常比不首先包含它們要難得多。

以更正x的相同方式制作y的更正版本會容易得多:

y_corr = [[n for m, n in zip(row_x, row_y) if m >= 30] for row_x, row_y in zip(x, y)]

在這里,我們只是使用zip來瀏覽兩組列表,就像處理一個列表一樣。

如果您絕對堅持使用坐標,則建議您完全復制y並從更正后的副本中刪除元素。 您必須在每一行中向后移動,以避免移動坐標的含義(例如,使用reversed )。 您可以使用itertools.groupby對每一行進行實際的迭代:

y_corr = [row.copy() for row in y]
for r, group in groupby(reversed(coord), itemgetter(0)):
    for c in map(itemgetter(1), group):
        del y_corr[r][c]

除了反轉coord ,您還可以分別反轉每個組,例如,使用map(itemgetter(1), reversed(group))

更好的方法可能是計算保留值的坐標,而不是舍棄值。 我建議預先分配輸出列表,以幫助跟蹤空列表並保留形狀:

from itertools import groupby
from operator import itemgetter

coord = [(r, c) for r, row in enumerate(x) for c, n in enumerate(row) if n >= 30]

y_corr = [[]] * len(x)
for r, group in groupby(coord, itemgetter(0)):
    y_corr[r] = [y[r][c] for c in map(itemgetter(1), group)]

如果您不關心保留空行,則可以跳過循環並改用單線:

y_corr = [[y[r][c] for c in map(itemgetter(1), group)] for r, group in groupby(coord, itemgetter(0))]

暫無
暫無

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

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