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