我想分别打印两个列表中的项目。我编写的代码如下:
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))
结果似乎不正确。我知道这是一个非常基本的循环问题,但我对输出的不同方式感到困惑。
答案 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_b
,IndentationError
将始终是for i in list_a:
for j in list_b:
print(str(i) + str(j))
的最后一项的编号通过整个事情。
虽然这段代码可能无法运行,因为存在空代码块,编译器可能会选择list_a
您的解决方案2 :
list_b
将逐步浏览所有A1B1
并针对每个元素,逐步完成所有A1B2
,这样您最终会得到A1B3
,CREATE 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答案基本相同。