Python嵌套循环打印



我正在用两个由4个信息数组组成的数组编写一个程序。一个有男性名字、女性名字和他们各自的排名(上下文令人困惑。(它基本上是两个长度相同的数组,每个数字都对应于该位置的名字。我知道我应该使用2D阵列,但我还没有学会。

这是示例代码。

namesM = ['Nathan', 'Jacob', 'Sam']
rankingsM =[100,200,20] 
namesF = ['Sarah','Beth', 'Sam']
rankingsF = [233,5456,246]

我的问题是:

for i in range(len(namesM)):
#print("%s (%d)" %(namesM[i], rankingsM[i]))
for j in range(len(namesF)):
if namesM[i]==namesF[j]:
print("%s (%d, %d)" %(namesF[j],rankingsM[i], rankingsF[j]))

我希望代码以这种方式打印出姓名

name (amount)

如果男性和女性阵列上有相同的名称,它应该打印

name (amount1, amount2)

最终应该是这样的:

Nathan (100) 
Jacob (200) 
Sam (246, 20)
Sarah (233)
Beth (5456)

我不知道如何正确地打印它。有什么帮助吗?

如果您将两个名字列表合并为一个,将两个排名列表合并为一体,那么您可以将这两个主列表zip放在一起,并对它们进行迭代以构建一个字典,边走边查找重复项。字典中的每个键都将是一个名称,每个值都将是分数列表(即使列表中只包含一个分数(。

namesM = ['Nathan', 'Jacob', 'Sam']
rankingsM =[100, 200, 20] 
namesF = ['Sarah', 'Beth', 'Sam']
rankingsF = [233, 5456, 246]
names = namesM + namesF
rankings = rankingsM + rankingsF
names_and_rankings = {}
for name, rank in zip(names, rankings):
if name in names_and_rankings:
names_and_rankings[name].append(rank)
else:
names_and_rankings[name] = [rank]

然后,您可以迭代字典的items(),它为您提供了键和值,通过简单的列表理解将排名转换为字符串,必要时用逗号将其join,并用f字符串打印您想要的输出。

for name, ranks in names_and_rankings.items():
ranks = ', '.join([str(i) for i in ranks])
print(f'{name} ({ranks})')

该输出:

Nathan (100)
Jacob (200)
Sam (20, 246)
Sarah (233)
Beth (5456)

如果你对一些稍微先进一点的技术感兴趣,你可以使用defaultdict来简化字典的创建:

from collections import defaultdict
# ...
names_and_rankings = defaultdict(list)
for name, rank in zip(names, rankings):
names_and_rankings[name].append(rank)

最后,这对于您的用例来说可能并不重要。但是,如果您的列表非常大,那么创建两个新列表namesrankings是低效的,这两个列表会复制您的所有值。在这种情况下,您可以使用itertools.chain。这不是在内存中创建全新的列表,而是简单地按顺序一个接一个地迭代现有列表。

from itertools import chain
# ...
names = chain(namesM, namesF)
rankings = chain(rankingsM, rankingsF)

不使用defaultdict:

data = {}
for name,rank in zip(namesM, rankingsM):
if name not in data:
data[name] = []
data[name].append(rank)
for name,rank in zip(namesF, rankingsF):
if name not in data:
data[name] = []
data[name].append(rank)
print(data)

更短:

from collections import defaultdict
data = defaultdict(list)
for name,rank in zip(namesM, rankingsM):
data[name].append(rank)
for name,rank in zip(namesF, rankingsF):
data[name].append(rank)
print(data)

最新更新