Python 从二维列表中删除元素
Python remove elements from two dimensional list
正在尝试从数组的二维列表中删除最小值和最大值。
我的代码:
myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
maxV = 0
minV = myList[0]0]
for list in myList:
for innerlist in list:
if innerlist > maxV:
maxV = innerlist
if innerlist < minV:
minV = innerlist
innerlist.remove(maxV)
innerlist.remove(minV)
print(myList)
这让我犯了一些错误,我不是特别明白。我很确定 innerlist 不是数组而是普通变量。但我仍然认为应该有可能从二维列表中删除最小和最大元素。
我的意思是我需要在列表中的每个内部列表中删除最高值和最低值。
LF求助!
问候。
取消缩进您的删除,将它们从循环中取出并:
maxV = -10000000
minV = 10000000 # !!
只是为了展示一种使用 list comprehensions
、sorted
方法和 slicing
:
的更简单的方法
d = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
n = [sorted(l)[1:-1] for l in d]
print(n)
# [[3], [4], [4]]
阅读 material 用于解决此问题的每个项目:
为了处理重复问题, Padraic 的回答做得很好。
试试这个方法:
foreach 内部列表:
- 对数组进行排序
- 删除第一个元素
- 删除最后一个元素
它应该像这样工作:
myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
for list in myList:
maxV = list[0] #initialise them here
minV = list[0] #because you look for max in list
for value in list:
if value> maxV:
maxV = innerlist
if value< minV:
minV = innerlist
list.remove(maxV) #remove from list
list.remove(minV)
print(myList)
您的错误所在:
minV = myList[0]0]
一个[
到一点
maxV = 0
仅当列表始终为正时才有效
maxV
和 minV
应该在第一个循环内
innerlist.remove(maxV)
应该是 list.remove(maxV)
我也将 innerList 重命名为 value
如果要删除所有出现的事件,则必须找到最小值和最大值并从每个子列表中删除所有出现的事件:
def remove(l):
for sub in l:
t = {min(sub), max(sub)}
sub[:] = (ele for ele in sub if ele not in t)
l = [[1, 3, 4], [1, 2, 4, 4], [3, 4, 5]]
remove(l)
哪个会给你:
[[3], [2], [4]]
要一次找到最小值和最大值,您可以使用辅助函数:
def min_max(sub):
# all numbers are > float("-inf") and < float("inf")
mx, mn = float("-inf"), float("inf")
for ele in sub:
if ele < mn:
mn = ele
if ele > mx:
mx = ele
return {mn, mx}
def remove(l):
for sub in l:
# find min and max
mn_mx = min_max(sub)
# update sublist so all occurrences of either are removed
sub[:] = (ele for ele in sub if ele not in mn_mx)
即使您自己的逻辑有效并且您想删除所有等于最大值的元素,使用 remove 也不起作用,因为它每次只会删除第一次出现的元素。
In [8]: l = [1,2,3,4,4]
In [9]: l.remove(4)
In [10]: l
Out[10]: [1, 2, 3, 4]
根据您的一条评论,您的子列表中似乎有字符串,与 int 相比会出错,如果字符串始终是第一个元素,您可以将其切掉:
from itertools import islice
def remove(l):
for sub in l:
sub = sub[1:]
mn_mx = min_max(sub)
sub[:] = (ele for ele in sub if ele not in mn_mx)
正在尝试从数组的二维列表中删除最小值和最大值。 我的代码:
myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
maxV = 0
minV = myList[0]0]
for list in myList:
for innerlist in list:
if innerlist > maxV:
maxV = innerlist
if innerlist < minV:
minV = innerlist
innerlist.remove(maxV)
innerlist.remove(minV)
print(myList)
这让我犯了一些错误,我不是特别明白。我很确定 innerlist 不是数组而是普通变量。但我仍然认为应该有可能从二维列表中删除最小和最大元素。 我的意思是我需要在列表中的每个内部列表中删除最高值和最低值。 LF求助! 问候。
取消缩进您的删除,将它们从循环中取出并:
maxV = -10000000
minV = 10000000 # !!
只是为了展示一种使用 list comprehensions
、sorted
方法和 slicing
:
d = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
n = [sorted(l)[1:-1] for l in d]
print(n)
# [[3], [4], [4]]
阅读 material 用于解决此问题的每个项目:
为了处理重复问题,
试试这个方法:
foreach 内部列表:
- 对数组进行排序
- 删除第一个元素
- 删除最后一个元素
它应该像这样工作:
myList = [[1, 3, 4], [2, 4, 4], [3, 4, 5]]
for list in myList:
maxV = list[0] #initialise them here
minV = list[0] #because you look for max in list
for value in list:
if value> maxV:
maxV = innerlist
if value< minV:
minV = innerlist
list.remove(maxV) #remove from list
list.remove(minV)
print(myList)
您的错误所在:
minV = myList[0]0]
一个[
到一点maxV = 0
仅当列表始终为正时才有效maxV
和minV
应该在第一个循环内innerlist.remove(maxV)
应该是list.remove(maxV)
我也将 innerList 重命名为 value
如果要删除所有出现的事件,则必须找到最小值和最大值并从每个子列表中删除所有出现的事件:
def remove(l):
for sub in l:
t = {min(sub), max(sub)}
sub[:] = (ele for ele in sub if ele not in t)
l = [[1, 3, 4], [1, 2, 4, 4], [3, 4, 5]]
remove(l)
哪个会给你:
[[3], [2], [4]]
要一次找到最小值和最大值,您可以使用辅助函数:
def min_max(sub):
# all numbers are > float("-inf") and < float("inf")
mx, mn = float("-inf"), float("inf")
for ele in sub:
if ele < mn:
mn = ele
if ele > mx:
mx = ele
return {mn, mx}
def remove(l):
for sub in l:
# find min and max
mn_mx = min_max(sub)
# update sublist so all occurrences of either are removed
sub[:] = (ele for ele in sub if ele not in mn_mx)
即使您自己的逻辑有效并且您想删除所有等于最大值的元素,使用 remove 也不起作用,因为它每次只会删除第一次出现的元素。
In [8]: l = [1,2,3,4,4]
In [9]: l.remove(4)
In [10]: l
Out[10]: [1, 2, 3, 4]
根据您的一条评论,您的子列表中似乎有字符串,与 int 相比会出错,如果字符串始终是第一个元素,您可以将其切掉:
from itertools import islice
def remove(l):
for sub in l:
sub = sub[1:]
mn_mx = min_max(sub)
sub[:] = (ele for ele in sub if ele not in mn_mx)