Python 从每个列表中删除第三个元素和第二个元素,并查找二维列表中最后一个元素在特定范围内的列表

Python 从每个列表中删除第三个元素和第二个元素,并查找二维列表中最后一个元素在特定范围内的列表,python,list,python-3.x,matrix,Python,List,Python 3.x,Matrix,我有两个问题 第一个问题: 我想知道如何从二维问题列表中删除第二个元素和第三个元素,以便如果变量questions最初如下所示: >>> questions >>> [['Johny', 'Baby', 'Shaw', '1984'], ['Andrew', 'fJKC', 'cbv bv', '1975'], ['Harry', 'Jack', 'Son', '1993']] 结果是: >>> questions >>>

我有两个问题

第一个问题:

我想知道如何从二维问题列表中删除第二个元素和第三个元素,以便如果变量questions最初如下所示:

>>> questions
>>> [['Johny', 'Baby', 'Shaw', '1984'], ['Andrew', 'fJKC', 'cbv bv', '1975'], ['Harry', 'Jack', 'Son', '1993']]
结果是:

>>> questions
>>> [['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]
第二个问题:

我如何找到一种知道两个值(最小值,最大值)的方法来打印列表问题中最后一个元素在范围内的三个列表中的任何一个(最小值,最大值)

预期成果:

例如,如果明显遵循之前的结果,最小值为
1980
,最大值为
2000
。它打印以下内容:

>>> ['Johny', '1984'], ['Harry', '1993']
以下是我的尝试:

beginning = int(input('Beginning: '))
ending = int(input('Ending: '))
position = []
for anyitem in range((len(questions)-1)):
    position1 = int(questions[anyitem][2][-4:])
        if beginning < position1 < ending:
            print(questions[anyitem][3])
        else:
            pass
start=int(输入('start:'))
ending=int(输入('ending:'))
位置=[]
对于范围内的任何项目((len(问题)-1)):
位置1=int(问题[anyitem][2][4])
如果开始<位置1<结束:
打印(问题[任何项目][3])
其他:
通过

请不要使用
numpy
或任何需要导入的函数。此外,请将解决方案设置为一般性的,这样它不仅可以应用于包含3个元素(如我的情况)而且包含许多元素(适用于所有人)的二维列表。

这两种方法都很容易处理列表理解和条件:

questions = [['Johny', 'Baby', 'Shaw', '1984'], ['Andrew', 'fJKC', 'cbv bv', '1975'], ['Harry', 'Jack', 'Son', '1993']]

print([x[:1]+x[3:] for x in questions])
结果:

[['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]
[['Johny', '1984'], ['Harry', '1993']]
随着过滤时间的延长:

print([x[:1]+x[3:] for x in questions if int(x[-1])>=1980 and int(x[-1])<=2000])
请注意,当您需要临时变量/副作用时(如上图:
int(x[-1])
必须计算两次,如果是年份,我们可以采用快捷方式并使用字符串比较,从1000年到9999年:

print([x[:1]+x[3:] for x in questions if x[-1]>="1980" and x[-1]<="2000"])
如果x[-1]>=“1980”和x[-1]问题1:

questions = [['Johny', 'Baby', 'Shaw', '1984'], ['Andrew', 'fJKC', 'cbv bv', '1975'], ['Harry', 'Jack', 'Son', '1993']]
new_questions = [[lst[0], lst[3]] for lst in questions]
问题2,假设您想使用原始的
问题列表:

in_range = [[lst[0], lst[3]] for lst in questions if int(lst[3]) in range(1980, 2001)]

删除第一个和第二个索引相对简单,一种方法(破坏性地)是使用切片分配:

>>> for d in questions:
...     d[1:3] = []
>>> questions
[['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]
列表理解也可以实现这一点,但确实需要构建一个新的列表(以及潜在的中间列表)

查找
min
max
只需要
参数(更新以包括
过滤器
要求):

>>min(过滤器(lambda x:int(x[1])>1980,问题),key=lambda x:x[1])
['Johny','1984']

>>>max(filter(lambda x:int(x[1])这两种方法都可以通过列表理解轻松实现

删除某些元素:

>>> nquestions = [[i ,j] for i, *_, j in questions]
>>> nquestions
[['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]
在这里,我们从每个子列表中解包,用
*.
抛开中间的元素,同时保留第一个和最后一个元素,以便从中创建新列表

对于筛选,最好创建一个自定义列表并使用另一个列表来筛选出该范围内
的值:

>>> r = range(1980, 2000)
>>> [i for i in nquestions if int(i[1]) in r]
[['Johny', '1984'], ['Harry', '1993']]

int(i[1])
是必需的,因为值是字符串。除了非常直观外,
range
对象的成员资格测试非常有效(请参阅:)。

对于您的第一个问题,此代码应该可以很好地完成

>>> for d in questions:
...     d[1:3] = []
我对你第二个问题的回答是

>>> min(questions, key=lambda x: x[1])
    ['Harry', '1993']

>>> max(questions, key=lambda x: x[1])
['Harry', '1993']

到目前为止,您有什么代码?您只显示了所需的输出。
>>> min(questions, key=lambda x: x[1])
    ['Harry', '1993']

>>> max(questions, key=lambda x: x[1])
['Harry', '1993']