在Python 3.4.3中将两个字符串列表合并为一个

3

我正在尝试将名字和姓氏的列表合并,但一直没有成功。目前我的代码如下:

firstname=['Tom','Dick','Steve']
surname=['Johnson','Smith','Doe']
for f in (firstname):
    for s in (surname):
        print(f,s)

这使我得到了类似这样的东西:
Tom Johnson
Tom Smith
Tom Doe
Dick Johnson

And so on, when I really want:

Tom Johnson
Dick Smith
Steve Doe

我这样的初学者非常感谢您的帮助。


1
只需将列表压缩在一起。 - midori
仅有那些还不足以按照指定格式输出结果。 - Shawn Mehan
4个回答

6
for name, surname in zip(firstname, surname):
   print(name, surname)

1
谢谢!这个运作得非常好。使用zip也可以反向迭代吗? - Mats
1
@Matsern 使用 reverse 来进行反转,但是你需要一个序列,而 zip 返回的是一个迭代器。所以首先将迭代器消耗成列表然后调用 reverse: reversed(list(zip(firstname, surname))). - Thijs van Dien
你可以使用while循环,虽然这种方法有点老旧,但是你可以以不同的方式控制(打印)列表中的元素,因为你提到了反转。谢谢! - user4398985
1
@ThijsvanDien 谢谢你的回答,但我发现在我的情况下zip(name, reversed(surname))效果最好。只是为了后人留下记录。 - Mats

1

在Python中,Zip是将两个列表合并在一起的方法。因此,作为一个函数,

def combine_names(first, last):
    comb = zip(first, last)
    for f,l in comb:
        print f,l

0
假设两个列表长度相同,您可以迭代它们并在两个列表上使用相应的索引:
for i in range(len(firstname)):
    print (firstname[i], surname[i])

这不是Pythonic的做法 - 这就是“zip”的作用。 - jsbueno

0
firstname=['Tom','Dick','Steve']
surname=['Johnson','Smith','Doe']
i = 0
while i<min(len(firstname), len(surname)):
    print (firstname[i], surname[j])
    i += 1

1
为什么这么低级? - Thijs van Dien
@ThijsvanDien 是的,这很老派。从他的问题来看,他缺少嵌套循环的基本概念。我猜他是新手程序员,所以我发布了这个经典而机械的 while 循环 :) - user4398985
1
我很感谢你的用心,但老实说,我觉得这段代码相当令人困惑。列表长度是相等的;即使它们不相等,为什么还要使用两个循环呢?在你的示例中,外部循环没有任何作用。 - Thijs van Dien
谢谢,我已经更新了。我删除了外部while循环,因为列表的长度保持相等,我想这不会成为问题。这太令人困惑了吗?你想让我删除这个答案吗? - user4398985
1
由于ij始终相等,因此您可以只使用i。为了考虑长度可能存在的差异,您可以使用while i < min(len(firstname), len(surname))。但是,您也可以使用for循环。然后,您也可以完全放弃索引...您看到这会导致什么。我不介意不同的实现,但在这种情况下,它确实是不必要的复杂化。我不确定这对OP有多大帮助。 - Thijs van Dien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接