【问题标题】:Python - appending an element of list of lists into new listPython - 将列表列表的元素附加到新列表中
【发布时间】:2018-01-25 16:19:14
【问题描述】:

我正在寻求帮助以解决一个问题...

假设我有一个列表:

list1 =[[1, 0, 2.83], [3, 1, 1.0], [5, 4, 2.83], [7, 0, 4.47], [6, 5, 4.24], [3, 2, 'x'], [4, 6, 'asd']

我想做的是基于内部列表的第三个元素的类型,从这些值中获取过滤后的最小值,前提是这些值是浮点数。

(如果第三个元素的值相同,那完全没问题,但是我很好奇这是否不会提供任何例外 - 对我来说,最好是随机选择它们)

我正在尝试这样的事情:

list1 = [[1, 0, 2.83], [3, 1, 1.0], [5, 4, 2.83], [7, 0, 4.47], [6, 5, 4.24], [3, 2, 'x'], [4, 6, 'asd']

something = min(filter(lambda x: x[2] is not isinstance(x[2], float) == True,list1))

...通过我从该列表中获取第一个元素:[1, 0, 2.83],而不是[3, 1, 1.0],其中第三个元素最低并且是浮点数。

【问题讨论】:

  • 预期的1.0 究竟来自哪里?
  • 发布的示例中您想要的输出是什么?
  • 对不起,我输入了错误的值。我想要的该列表的输出是 [3, 1, 1.0],因为 1.0inner liststhird 元素中最低的

标签: python python-3.x list filter


【解决方案1】:
something = min((x for x in list1 if isinstance(x[2], float)), key=lambda x: x[2])

顺便说一下,恕我直言,最适合这种情况的数据结构是tuples 中的list,因为它们构成了固定大小的异构集合(在这种情况下为三元组),如下所示:

list1 = [(1, 0, 2.83), (3, 1, 1.0), (5, 4, 2.83), (7, 0, 4.47), (6, 5, 4.24), (3, 2, 'x')]

【讨论】:

  • 好的,这解决了我的问题 - 我会考虑元组。感谢您的快速回复。
【解决方案2】:

你可以试试这个:

list1 =[[1, 0, 2.83], [3, 1, 1.0], [5, 4, 2.83], [7, 0, 4.47], [6, 5, 4.24], [3, 2, 'x'], [4, 6, 'asd']]
min_val = min(filter(lambda x:not isinstance(x[-1], str), list1), key=lambda x:x[-1])

输出:

[3, 1, 1.0]

【讨论】:

    【解决方案3】:

    您正在使用错误的min 函数 - 它使用整个元组进行排序(以及列表的元组规则排序顺序中的第一个值)。我建议使用从元组中提取最后一个元素的键:

    min(..., key=lambda b: b[2])
    

    【讨论】:

    • 是的,我现在知道了。感谢您的帮助:)
    【解决方案4】:

    还有这个选项:

    >>> from operator import itemgetter
    >>> list1 =[[1, 0, 2.83], [3, 1, 1.0], [5, 4, 2.83], [7, 0, 4.47], [6, 5, 4.24], [3, 2, 'x'], [4, 6, 'asd']]
    >>> min((x for x in list1 if isinstance(x[-1], float)), key = itemgetter(-1))
    [3, 1, 1.0]
    

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 2016-09-17
      • 2020-10-29
      • 2020-09-02
      • 2023-03-09
      • 2015-02-05
      • 2021-10-06
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多