2014-02-09 20 views
1

我需要生成一个文件,其中每行是一个句子(模板)和四个变量的连接。 这四个变量(分别是它们的值)之前已经收集在单独的列表中。 到目前为止,我曾尝试:Python - 多个列表中的字符串连接?

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

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

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

+0

感谢您的编辑! –

+0

感谢大家的快速和现场帮助!我显然没有完全掌握迭代/极限的概念。 –

回答

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] ...这就是为什么你错误。

更改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

+0

用户是python的新手,需要解释他的错误,而不是固定的。 – digenishjkl

+0

谢谢张!复制你的解决方案,就像一个魅力。 –

+0

@m_br很高兴它的工作; P – zhangxaochen

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 - 终止字符串
+0

谢谢Óscar!模板aproach已经/新颖的我,并提出了KeyError,第二次替代。但是我一定会查看文档,尤其是它应该成为新的标准 –

1

对于python中的语句有以下语法。

for <value> in <iterable>: 
    body 

List is a <iterable> data type. 

现在,它意味着你可以遍历它。我建议你阅读关于iterables更多informatino的文档,以及如何在你的类定义中实现它们。但是列表,列表,列表不是。 您需要将这些列表连接成一个列表。

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

,你可以在你的情况

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

将会做价值

UNMATCH它。

0

要回答关于如何“密林”的部分,您可能需要将其放入字典列表中。该数据结构看起来像这样:

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

keys = 'index', 'fruit_name', 'fruit_plural_name' 
items = [dict(zip(keys, item)) for item in zip(num, fruit, fruits)] 

with open('result', 'w') as f: 
    for item in items: 
     f.write("This is string number {index}. This is a {fruit_name}. And I like to eat {fruit_plural_name}\n".format(**item))