我需要帮助理解Python3中两个,两个元组的迭代

时间:2017-11-16 04:07:11

标签: python python-3.x

我需要帮助试图理解为什么这个函数返回姓氏姓氏而不是名字。这是循环的第一个让我困惑的相信。对于某些背景,第一个for循环中的路径只是列出不同名称的文本文件,每行一个。当文件中的每个名字都被追加到名字变量中时,为什么我们要返回姓氏和姓氏?请帮助,如果需要更多信息,请告诉我。

import random

def get_forenames_and_surnames():
    forenames = []
    surnames = []
    for names, filename in ((forenames, "/home/mmelv/eclipse-
                                workspace/py30eg/data/forenames.txt"),
                        (surnames, "/home/mmelv/eclipse-
                                workspace/py30eg/data/surnames.txt")):
        with open(filename, encoding="utf8") as file:
            for name in file:
                names.append(name.rstrip())
    return forenames, surnames


forenames, surnames = get_forenames_and_surnames()
with open("test-names1.txt", "w", encoding="utf8") as file:
    for i in range(100):
        line = "{0} {1}\n".format(random.choice(forenames),
                                  random.choice(surnames))
        file.write(line)

带有前缀名列表的文件如下所示:

Ailish
Cayden
Cohen
Maison
Becky
Dodou
Nickie
Zachary
Climate

带有姓氏列表的文件是相同的,但名称不同。

2 个答案:

答案 0 :(得分:0)

  

理解为什么这个函数返回forenames姓氏而不是名字

嗯...... return forenames, surnames就是它的原因。底部的格式需要两个单独的列表。 (return names实际上会返回surnames

The loop is doing tuple-unpacking。每次迭代,您解压缩一个元组并分配names, filename。由于names是列表引用,names.append()的运行方式与forenames.append()surnames.append()相同,具体取决于迭代次数。

FWIW,您可以重写第一个使用two explicit loops per file的函数。

def get_forenames_and_surnames():
    forenames = [line.rstrip() for line in open("/home/mmelv/eclipse-workspace/py30eg/data/forenames.txt", encoding="utf8")]
    surnames = [line.rstrip() for line in open("/home/mmelv/eclipse-workspace/py30eg/data/surnames.txt", encoding="utf8")]
    return forenames, surnames

如果您想使用一个列表,请查看zip()功能。

答案 1 :(得分:0)

返回的内容基本上是这样的:

(['Ailish', 'Cayden', 'Cohen', 'Maison', 'Becky', 'Dodou', 'Nickie', 'Zachary', 'Climate'],
['Ailish2', 'Cayden2', 'Cohen2', 'Maison2', 'Becky2', 'Dodou2', 'Nickie2', 'Zachary2',
'Climate2'])

所以你得到一个包含两个对象的元组,每个对象都是一个名字列表,元组中的第一个列表被命名为forenames,第二个列名为姓氏。

您编写的代码的结尾部分只是从第一个名称列表中获取一个随机名称,并将其与第二个名称列表中的随机名称进行匹配。