【问题标题】:list comprehension with input().split()使用 input().split() 进行列表理解
【发布时间】:2021-01-05 18:35:04
【问题描述】:

我必须阅读 N 然后 N 两个数字的元组,如下例所示:

3
1 85
2 91
3 73

之后,我想根据第二个元素对它们进行排序,并按照它们进入输入的顺序打破平局。为此,我想保存一个包含 3 个元素的元组,但我不知道如何将其放入列表理解语法中。

我想要一个等同于的理解:

n = int(input())
l = []
for i in range(n):
    v1, v2 = input().split()
    l.append((int(v1), int(v2), i))

这是我尝试过的:

n = int(input())
l = [(int(v1), int(v2), i) for v1, v2 in input().split() for i in range(n)]

【问题讨论】:

    标签: python tuples list-comprehension


    【解决方案1】:

    使用tuple()list comprehension

    num_tuples = int(input())
    lst = [tuple([int(x) for x in input().split()] + [i]) for i in range(num_tuples)]
    print(lst)
    

    示例输入:

    2
    1 2
    3 4
    

    输出:

    [(1, 2, 0), (3, 4, 1)]
    

    【讨论】:

      【解决方案2】:

      可以做这样的事情:

      l = [(*map(int, input().split()), i) for i in range(int(input()))]
      

      但这很令人困惑和难以理解,当你的 for 循环完全足够时,为什么要这样做呢?

      【讨论】:

      • 刚刚习惯了 python 的语法......例如,这个*map 对我来说很新......现在谷歌搜索以了解更多信息
      • @vmp 这只是在元组文字中的可迭代解包:python.org/dev/peps/pep-0448 所以,(*any_iterable, 2, 3)
      • @juanpa.arrivillaga 你是怎么做到以上这些的?我在range(int(input()))(*map(...)) 上遇到错误,说SyntaxError: iterable unpacking cannot be used in comprehension。我使用的python3版本是3.6.6.
      • @juanpa.arrivillaga 似乎在 3.7+ 中有效,只是添加了一个答案。
      【解决方案3】:

      让我们先把程序写出来,不要压缩语法来建立我们的起点

      n = int(input())
      l = []
      for i in range(n):
          v1, v2 = input().split()
          l.append((int(v1), int(v2), i))
      
      l = sorted(l, key=lambda x: (x[1], x[2])) # here is the line I'm adding to sort
      print(l)
      
      $ python3 test.py
      3
      1 85
      2 91
      7 91
      [(1, 85, 0), (2, 91, 1), (7, 91, 2)]
      

      将 for 循环中的两个语句放入列表理解中有点复杂——也许更糟:很难维护或阅读——将两个语句放在列表理解中(尽管前面的两个答案都显示了它是如何完成的),所以如果你想做一个单行,我在这里的建议是将它放在一个带有lambda 函数的map 中,例如:

      def my_function(num):
          v1, v2 = input().split()
          return (int(v1), int(v2), num)
      
      n = int(input())
      l = map(my_function, range(n))
      

      美观且易读。如果您还想在一行中进行排序(以及其他所有操作),您当然可以这样做:

      sorted(map(my_function, range(int(input())), key=lambda x: (x[1], x[2]))
      # 1 2
      # 2 3
      # [(1, 2, 0), (2, 3, 1)]
      

      这就是它的整体外观(一旦我弄明白了,我会添加一个分享链接):

      【讨论】:

      • 不需要 lambda,map(lambda x: f(x), iterable) 应该是 map(f, iterable)
      • @juanpa.arrivillaga 对,感谢您指出这一点:已更新。
      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      相关资源
      最近更新 更多