【问题标题】:Python - get unique and sorted values in list of lists [closed]Python - 在列表列表中获取唯一和排序的值[关闭]
【发布时间】:2018-12-25 22:33:24
【问题描述】:

我想操纵结果以从中获得:

[[50, 100],[100, 130],[20, 50, 100, 130]]

到这里:

[[0, 50, 100, 0],[0 ,0, 100, 130],[20, 50, 100, 130]]

这个想法是用零填充相同值之间的空白,这将表示在达到相同值之前没有值。

【问题讨论】:

  • 后面有什么规则吗,我看到第一个和第二个列表的规则不同。
  • 您能详细说明您的期望吗?
  • 你的问题背后的逻辑是什么?
  • 所以[20,50] 应该变成[20,50,0,0][20,100] 甚至 [130,20] 呢?
  • 你如何定义差距?

标签: python list


【解决方案1】:

由于您的问题没有明确说明:此答案假定所有列表中的条目应该在之后进行排序,并且每个数字在每个子列表中都是唯一的。

您可以通过以下方式达到此目的:

numbers = [[50, 100],[100, 130],[20, 50, 100, 130]]

unique = sorted({n for l in numbers for n in l})

new_numbers = [[x if x in l else 0 for x in unique] for l in numbers]

new_numbers
> [[0, 50, 100, 0], [0, 0, 100, 130], [20, 50, 100, 130]]

对解决方案的一些解释:首先,获取原始列表中出现的所有(唯一)数字。然后,遍历原始列表并将 0 添加到唯一编号中的数字不属于子列表的位置。注意,在这个操作过程中,原来的列表会被排序,所以[100, 50]会变成[0, 50, 100, 0]

编辑:由于 juanpa.arrivillaga 的评论而变得更加 Pythonic。

【讨论】:

  • 你能解释一下逻辑吗?
  • @PeterWood 我添加了一个解释。这够了吗?
  • 谢谢,它按预期工作
  • @Markus:需求猜测总是有风险的;我注意到,所有给定的列表都是有序的,问题没有另外说明。
  • 不需要在set 上调用list 只是为了传递给sorted,它接受任何可迭代的,(无论如何它都会在内部转换为列表)。您也可以使用集合理解。 {n for l in numbers for n in l}
【解决方案2】:
l = [[50, 100],[100, 130],[20, 50, 100, 130]]
r = sorted(l, key=len)[-1]
print([[n if n in i else 0 for n in r] for i in l])

这个输出:

[[0, 50, 100, 0], [0, 0, 100, 130], [20, 50, 100, 130]]

【讨论】:

    【解决方案3】:

    您首先找到所有唯一可能数字的列表并将其存储在排序列表中s。然后浏览原始列表中的所有子列表,然后对于子列表,浏览排序列表并返回元素,如果它在排序列表中,如果不是 0

    >>> l = [[50, 100],[100, 130],[20, 50, 100, 130]]
    >>> s = sorted(set([e for sl in l for e in sl]))
    >>> [[e if e in sl else 0 for e in s] for sl in l]
    [[0, 50, 100, 0], [0, 0, 100, 130], [20, 50, 100, 130]]
    

    【讨论】:

    • 请解释一下这个问题的逻辑
    • @U9-转发。添加了一些解释
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多