我需要生成一个文件,其中每一行是句子(模板)和四个变量的串联。 这四个变量(分别是它们的值)先前已收集在单独的列表中。 到目前为止,我已经尝试过:
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”,即首先将第一个和第二个变量+字符串连接到一个中间列表,以减少“复杂性”。
有人能给我一个暗示我失败的地方吗?
答案 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