Python, how to print specific items from lists in lists?
我正在打印列表中所有列表的第一个和最后一个项目num_list。
1 2 3 4 5
| 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,10和100。
解决这个问题的好方法是什么?
- range(0,1) and range(2,3)这并不像你想象的那样。它只是返回range(2,3),因为bool(range(0,1))是True(见此)。你想要的是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)不返回True,bool(range(0,1))返回True,bool(range(2,3))返回True,因为bool(sequence)通常与len(sequence) > 0相同。a and b与b if a else a相同。这是一个非常基本的Python概念。请参阅我前面提供的链接。
- 谢谢你的评论@fhtmitchell。当您说bool(sequence)通常与len(sequence)相同时,这是否意味着字符串"range(0,1)"的长度大于0时,它会返回true?对不起,如果我要离开这里的话!只是想理解。
- 这与弦无关。我说的是价值观。在python控制台中尝试print(len(range(0, 1)))。这是1,因为range(0, 1)代表了[0]的序列。通过将任何range对象的值传递到一个列表(如list(range(20))中),可以提取该对象的可视化。您可以有空的范围,例如range(0,0),这些范围被认为是False。
- @再次感谢,当你说"它是1,因为范围(0,1)代表序列[0]"的时候,你能在我迷路的时候再把它扩大一点吗?序列[0]是一个空列表(我认为是因为方括号)还是一个序列是Python中我还没有遇到的一种类型(例如变量类型)?
- 序列是"有序数据"的抽象,实际上它在collections.abc模块中被定义为一个抽象类,即Sequence。list、tuple和range都是它的子类。当我说序列时,我这样做是因为从技术上讲,range不是list,但我们可以假装它是(并通过传递给list)。[0]不是一个空序列,它是一个含有一个元素0的序列。[]是一个空序列。
- 我使用方括号是因为所有序列都可以表示为列表,即使它们在技术上不是这样。例如,(1,2,3)、[1,2,3]和range(1,4)都表示相同的序列,即使它们有不同的类型。有些集合不是序列,例如集合{1,2,3},因为集合没有顺序。{1,2,3} == {2,3,1} == {3,1,2}
- 很好的回答@fhtmitchell,谢谢你的帮助!
你不需要使用范围来完成你的任务。不管怎样,即使您愿意,您的代码行中也有一个错误
1
| range(0,1) and range(2,3) |
根据定义,and返回第一个值,该值为假;否则,如果没有,则返回表达式中的最后一个值。因此,在您的情况下,它只返回range(2,3)。
的确,
1
| range(0,1) and range(2,3) |
收益率
因为bool(range(0,1))和bool(range(2,3))都被认为是真的。这就是为什么它们都是非空序列。实际上,bool(range(2,2))将被评估为False为空。有关更多详细信息,请参阅文档。
你应该写些像
1 2 3 4 5 6 7
| 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是做什么的?
- 当您说'并返回第一个值(即假)时,如果没有,则返回表达式中的最后一个值'-您的意思是范围(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))的计算结果为真,返回值为bool(range(2,3))。这就是为什么你只得到3, 30, 300作为输出的原因。
- 再想一想,如果范围(0,1)返回真,那么为什么范围(2,3)返回范围(2,3)而不仅仅是"真"?
使用索引。
前任:
1 2 3 4
| 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吗?我知道我[0]是1,10100…但为什么我是3,30300?
- stackoverflow.com/questions/11367902/negative-list-index
- 谢谢@rakesh,要"激活"负列表索引,您只需要使用负符号吗?然后代码知道你在使用nli?
- 没错。
- @Joshuaesummers不完全是。它不是符号,而是价值。(-1)为数值。你也可以先做x = -1,然后再做i[x]。
1 2 3 4
| num_list = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]
for each in num_list:
print (each[0], each[-1]) |
- 你能解释一下你的答案吗?每个人都做什么?每一个[0],每一个[-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@joshuaesummers each编写,表示list num_列表中的元素。也就是说,each在第一次迭代中有值[1, 2, 3],在第二次迭代中有值[10, 20, 30],最后是[100, 200, 300]。第一次迭代:打印每个[0],每个[-1]输出=>1 3第一次迭代:打印每个[0],每个[-1]输出=>10 30第一次迭代:打印每个[0],每个[-1]输出=>100 300
range(0,1)和range(2,3)返回=>range(2,3)
- 这个答案是一个声明性陈述。这就足够了(不是真的)。您能否详细说明为什么Python会这样做,并尝试解决"什么是解决这个问题的好方法?"谢谢。