嵌套for循环python

时间:2016-10-30 07:03:07

标签: python for-loop

我想分别打印两个列表中的项目。我编写的代码如下:

 for i in list_a:
     for j in list_b:
     print(str(i) + str(j))

理想的结果是" A1 + B1"," A2 + B2"等。但是,上面的行只是list_b中的最后一项。当我进一步缩进打印声明时:

for i in list_a:
    for j in list_b:
        print(str(i) + str(j))

结果似乎不正确。我知道这是一个非常基本的循环问题,但我对输出的不同方式感到困惑。

2 个答案:

答案 0 :(得分:4)

如何使用zip?

for a, b in zip(list_a, list_b):
    print('%s + %s' % (a, b))

Zip将两个或多个列表合并为元组,例如:

zip([1, 2, 3], [4, 5, 6]) # [(1, 4), (2, 5), (3, 6)]

此外,当您执行print(a + b)时,只需将字符串添加到一起,这意味着连接。例如。如果a"a"b"b",则a + b会产生"ab",而不是"a + b",就像您想要的那样。

答案 1 :(得分:1)

我添加了另一个答案,因为没有人解释为什么这段代码不起作用。在我看来,OP实际上在寻找什么。

您的解决方案1 ​​

for i in list_a:
     #This indentation is inside 'i' loop
     for j in list_b:
          #This indentation is inside 'j' loop  
     print(str(i) + str(j))

将逐步执行list_a,并且对于每次迭代,逐步执行所有list_b(因为list_b代码块中没有任何内容,每个步骤都不会发生任何事情)然后打印,因此它将打印出i中的list_a j list_bIndentationError将始终是for i in list_a: for j in list_b: print(str(i) + str(j)) 的最后一项的编号通过整个事情。

虽然这段代码可能无法运行,因为存在空代码块,编译器可能会选择list_a

您的解决方案2

list_b

将逐步浏览所有A1B1并针对每个元素,逐步完成所有A1B2,这样您最终会得到A1B3CREATE FUNCTION [dbo].[KeywordMatches] ( @String nvarchar(1000), @Keywords nvarchar(1000), @Seperator text ) RETURNS INT AS BEGIN DECLARE @Count int = 0; DECLARE @Keyword varchar(1000); DECLARE KeywordsCursor CURSOR FOR SELECT * FROM [dbo].StringSplit(@Keywords, @Seperator) OPEN KeywordsCursor FETCH NEXT FROM KeywordsCursor INTO @Keyword WHILE @@FETCH_STATUS = 0 BEGIN IF @String LIKE '%' + @Keyword + '%' SET @Count += 1 FETCH NEXT FROM KeywordsCursor INTO @Keyword END CLOSE KeywordsCursor DEALLOCATE KeywordsCursor RETURN @Count END CREATE FUNCTION [dbo].[StringSplit] ( @SeperatedWords nvarchar(1000), @Seperator char ) RETURNS @Words TABLE ( Word nvarchar(1000) ) AS BEGIN DECLARE @Position int = -1 SET @SeperatedWords += @Seperator WHILE (@Position > 0 OR @Position = -1) BEGIN SET @SeperatedWords = SUBSTRING(@SeperatedWords, @Position + 1, LEN(@SeperatedWords) - @Position + 1) SET @Position = CHARINDEX(@Seperator, @SeperatedWords) /* Only add words that have a length bigger then 0 */ IF @Position > 1 /* Add the word to the table */ INSERT INTO @Words(Word) VALUES(LEFT(@SeperatedWords, @Position - 1)) END RETURN END 等等。

首选解决方案

解决方案是同时逐步浏览两个列表,速度与this answer完全相同,与@Pavlins答案基本相同。