【问题标题】:Removing third element and second from each list and finding lists which have last elements within specific range in a 2D list从每个列表中删除第三个元素和第二个元素,并查找在二维列表中具有特定范围内最后一个元素的列表
【发布时间】:2016-11-19 18:46:40
【问题描述】:

我有两个问题。

第一个问题:

我想知道如何从二维列表问题中删除每个第二个元素和第三个元素,这样如果变量 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

请不要使用numpy 或任何需要导入的函数。另外,请使解决方案通用,因此它可以应用于不仅包含 3 个元素(如我的情况)而且包含许多元素(适用于所有人)的 2D 列表。

【问题讨论】:

  • 到目前为止你有什么代码?您只显示了所需的输出。

标签: python list python-3.x matrix


【解决方案1】:

两者都可以通过列表推导轻松完成。

删除某些元素:

>>> nquestions = [[i ,j] for i, *_, j in questions]
>>> nquestions
[['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]

在这里,我们从每个子列表中解包,用*_ 丢弃中间元素,同时保留第一个和最后一个,以便从中创建新列表。

对于过滤,最好创建一个自定义 range 并使用另一个列表推导过滤掉该范围内的 in 值:

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

int(i[1]) 是必需的,因为值是字符串。除了非常直观之外,range 对象的成员资格测试非常有效(参见:Why is "1000000000000000 in range(1000000000000001)" so fast in Python 3?)。

【讨论】:

    【解决方案2】:

    使用列表推导和条件都很容易做到:

    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']]
    

    过滤年份:

    print([x[:1]+x[3:] for x in questions if int(x[-1])>=1980 and int(x[-1])<=2000])
    

    结果:

    [['Johny', '1984'], ['Harry', '1993']]
    

    请注意,当您需要临时变量/副作用时,listcomps 并不是最好的(如上:int(x[-1]) 必须计算两次,在多年的情况下,我们可以采取捷径并使用字符串比较,适用于1000 年到 9999 年:

    print([x[:1]+x[3:] for x in questions if x[-1]>="1980" and x[-1]<="2000"])
    

    当我们到达 10000 年时,我会编辑我的答案 :)

    【讨论】:

      【解决方案3】:

      问题一:

      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,假设你要使用原来的questions列表。:

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

      【讨论】:

        【解决方案4】:

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

        >>> for d in questions:
        ...     d[1:3] = []
        >>> questions
        [['Johny', '1984'], ['Andrew', '1975'], ['Harry', '1993']]
        

        列表推导式也可以实现这一点,但确实需要构造一个新列表(以及可能的中间列表)。

        发现minmax 只需要key 参数(更新为包括filter 要求):

        >>> min(filter(lambda x: int(x[1])>1980, questions), key=lambda x: x[1])
        ['Johny', '1984']
        >>> max(filter(lambda x: int(x[1])<2000, questions), key=lambda x: x[1])
        ['Harry', '1993']
        

        【讨论】:

          【解决方案5】:

          对于您的第一个问题,此代码应该可以解决问题

          >>> 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']
          

          【讨论】:

            猜你喜欢
            • 2022-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多