Python - 来自多个列表的字符串连接?

时间:2014-02-09 16:17:02

标签: python string list iteration

我需要生成一个文件,其中每一行是句子(模板)和四个变量的串联。 这四个变量(分别是它们的值)先前已收集在单独的列表中。 到目前为止,我已经尝试过:

num = [1,2,3]
fruit = [grape ,banana,pea]
fruits = [grapes, bananas, peas]

with open('result', 'w') as r:
    for n,f,g in num,fruit,fruits: 
        r.writelines("This is string number %d. This is a %s. And I like to eat %s" % (num[n],fruit[f],fruits[g]))

......这种方法提出了:

TypeError: list indices must be integers, not tuple

我也没有与不同的列表一起“mungling”,即首先将第一个和第二个变量+字符串连接到一个中间列表,以减少“复杂性”。

有人能给我一个暗示我失败的地方吗?

3 个答案:

答案 0 :(得分:1)

解决问题的更惯用的方法是:

template = "This is string number {}. This is a {}. And I like to eat {}\n"
with open('result', 'w') as r:
    for n, f, fs in zip(num, fruit, fruits):
        r.write(template.format(n, f, fs))

请注意以下事项:

  • 在您的代码中,此代码段:in num,fruit,fruits正在创建一个包含三个列表的元组;您必须使用zip()将输入列表打包并同时遍历它们
  • 循环中的n,f,g迭代变量引用列表中的实际元素,而不是索引。这就是为什么这段代码:num[n],fruit[f],fruits[g]引发了错误
  • 不推荐使用格式化字符串的%语法,应避免使用format()
  • writelines()用于编写行列表,用于编写单行,使用write()传递\n - 终止字符串

答案 1 :(得分:1)

对于python中的语句,语法如下。

for <value> in <iterable>:
   body 

List is a <iterable> data type. 

现在,这意味着你可以遍历它。我建议你阅读文档,了解有关iterables以及如何在类定义中实现它们的更多信息。

但是列表,列表,列表不是。 您需要将这些列表连接到一个列表中。

zip(l1,l2,l3)会为你做模式匹配。 它会创建一个列表,其元素与元组中的索引匹配。

你可以在值

时取消匹配

在你的情况下

for (n,f,g) in zip(num,fruit,fruits): 

会做的。

答案 2 :(得分:0)

num,fruit,fruits提供了一个元组,使for n,f,g in num,fruit,fruits:等于:

atuple=num,fruit,fruits
for n,f,g in atuple:
    ...

所以for循环解包atuple[0](即num),将值num[0], num[1], num[2]分配给n,f,g,然后fruit[0], fruit[1], fruit[2] ......&# 39;为什么你得到错误。

for n,f,g in num,fruit,fruits:更改为:

for tup in zip(num,fruit,fruits): 
    r.writelines("This is string number %d. 
                  This is a %s. And I like to eat %s" % tup)

请参阅docs for zip