【问题标题】:Python, how to print specific items from lists in lists?Python,如何从列表中的列表中打印特定项目?
【发布时间】:2018-08-23 15:30:57
【问题描述】:

我正在尝试打印列表列表num_list 中所有列表的第一项和最后一项。

num_list = [[1,2,3],[10,20,30],[100,200,300]]

for x in range(0,3):
    for y in range(0,1) and range(2,3):
        print(num_list[x][y])

但这只是打印3,30,300并跳过1,10100

有什么好的方法可以解决这个问题?

【问题讨论】:

  • range(0,1) and range(2,3) 这并不像您认为的那样。它只返回range(2,3),因为bool(range(0,1))True(参见this)。你想要的是for y in [0, 2](我期待)。
  • 谢谢@FHTMitchell,为什么 range(0,1) 返回 true?
  • @FHTMitchell 再想一想,如果 range(0,1) 返回 True,那么为什么 range(2,3) 返回 range(2,3) 而不是 True?
  • range(0,1) 不返回 Truebool(range(0,1)) 返回 Truebool(range(2,3)) 也是如此,因为 bool(sequence)(通常)与 len(sequence) > 0 相同。 a and bb if a else a 相同。这是一个非常基本的 Python 概念。请参阅我之前提供的链接。
  • 感谢@FHTMitchell 的评论。当您说 bool(sequence) 通常与 len(sequence) 相同时,这是否意味着字符串“range(0,1)”的长度> 0,它返回 true?对不起,如果我在这方面做得不好!只是想理解。

标签: python list printing


【解决方案1】:

使用索引。

例如:

num_list = [[1,2,3],[10,20,30],[100,200,300]]

for i in num_list:
    print(i[0], i[-1])   #i[-1] == negative indexing. 

输出:

1 3
10 30
100 300

【讨论】:

  • 嗨,您介意解释一下为什么使用-1吗?我知道 i[0] 是 1,10,100... 但为什么 i[-1] 是 3,30,300?
  • 谢谢@Rakesh,要“激活”负面列表索引,您只需要使用负面符号吗?那么代码就知道你在使用 NLI?
  • @JoshuaESummers 不完全是。这不是符号,而是价值。 (-1) 是值。你也可以先x = -1 然后i[x]
  • 负 1 索引访问最后一个元素。
【解决方案2】:

您不需要使用范围来完成您的任务。
无论如何,即使您愿意,您的代码行中也有错误

range(0,1) and range(2,3)

根据定义and返回第一个值为False,否则返回表达式中的最后一个值。
因此,在您的情况下,它只返回 range(2,3)

确实,

range(0,1) and range(2,3)

返回

range(2, 3)

因为bool(range(0,1))bool(range(2,3)) 都被评估为True。
这就是为什么它们都是非空序列的原因。事实上bool(range(2,2)) 将被评估为False 为空。更多详情请参阅documentation

你应该写类似的东西

import itertools

num_list = [[1,2,3],[10,20,30],[100,200,300]]

for x in range(0,3):
    for y in itertools.chain(range(0,1), range(2,3)):
        print(num_list[x][y])

使用itertools.chain

【讨论】:

  • 谢谢。 intertools 有什么作用?
  • 当你说'并返回第一个值为 False 的值,否则如果没有,则返回表达式中的最后一个值' - 你的意思是 range(0,1) 为假吗?或者你是说因为 range(0,1) 不是 false 它返回最后一个值 (range(2,3))?对不起,我有点困惑!
  • itertools (docs.python.org/3/library/itertools.html) 包含一组处理迭代器的函数。在您的情况下,您想要遍历两个迭代器 range(0,1)range(2,3)。为此,您可以像示例中一样使用itertools.chain。在您的特定情况下,没有必要,因为列表的直接索引就足够了。
  • 因为bool(range(0,1))bool(range(2,3)) 被评估为True,所以返回的是bool(range(2,3))。这就是为什么您只会得到 3, 30, 300 作为输出。
  • 再想一想,如果 range(0,1) 返回 True,那为什么 range(2,3) 返回 range(2,3) 而不仅仅是 'True' 呢?跨度>
【解决方案3】:
num_list = [[1,2,3],[10,20,30],[100,200,300]]

for x in range(0,3):

    for y in range(len(num_list[x])):
        if y==0 or y==2:
            print(num_list[x][y])

你可以使用上面的代码

【讨论】:

    【解决方案4】:

    可能是最小的解决方案:

    num_list = [[1,2,3],[10,20,30],[100,200,300]]
    for x in num_list:
        print(x[0], x[-1])
    

    【讨论】:

      【解决方案5】:

      range(0,1) 和 range(2,3) 返回 => range(2,3)

      【讨论】:

      • 这个答案是一个声明性声明。这很好(不是真的)。您能否详细说明为什么 python 这样做并尝试解决“解决这个问题的好方法是什么?”谢谢。
      【解决方案6】:
      num_list = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]
      
      for each in num_list:
          print (each[0], each[-1])
      

      【讨论】:

      • 你能解释一下你的答案吗?各自做什么? each[0], each[-1] 结构是什么意思?就像它在'each [0]'和'each [-1]'之间打印,这与范围(0,1)有多少等价?
      • each 只是num_list 的每个元素,所以第一次迭代each[1,2,3],第二次是[10,20,30],第三次是[100,200,300]each[0], each[-1] 是每个 each 的第一个和最后一个元素,例如[1,3].
      • @FHTMitchell 这段代码是用python3写的@JoshuaESummerseach代表列表num_list中的元素。这意味着each 在第一次迭代中将具有值[1, 2, 3],在第二次迭代中将具有[10, 20, 30],然后最终将是[100, 200, 300]。第一次迭代:打印 each[0], each[-1] 输出 => 1 3 第一次迭代:打印 each[0], each[-1] 输出 => 10 30 第一次迭代:打印 each[0], each[- 1] 输出 => 100 300
      【解决方案7】:

      这是基于原始解决方案的答案,但不是最好的答案

      num_list = [[1,2,3],[10,20,30],[100,200,300]]
      
      for x in range(0, len(num_list)):
      
          for y in range(0,3,2): #where the change should be
              print(num_list[x][y],end=' ') #display the results in one line
      

      【讨论】:

      • 您的解决方案有哪些优点/缺点?
      • 这个答案是对作者答案的一种更正,而不是创新的答案,使用像@Shivam Jha 解决方案这样的负索引方法会更有效
      【解决方案8】:

      如果你想要短的单线,其他解决方案:

      如果一行打印对您有好处,则提供 3 个 oneliner 解决方案:

      print(*[num for elem in vec for num in elem[0:3:2]])
      
      print(*[num for elem in vec for num in elem[0:1]+elem[2:3]])
      
      print(*[num for elem in vec for num in elem[0:1]+elem[-1:]])
      

      输出:

      1 3 10 30 100 300
      

      或每行打印一个数字:

      print('\n'.join([str(num) for elem in vec for num in elem[0:3:2]]))
      
      1
      3
      10
      30
      100
      300
      

      【讨论】:

        猜你喜欢
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-22
        • 1970-01-01
        • 2022-08-08
        • 1970-01-01
        相关资源
        最近更新 更多