使用循环和字典更快地解决问题

时间:2020-10-28 16:59:58

标签: python performance loops dictionary

我最近已经解决了一个问题,并且我肯定知道必须有一个更快的解决方案。我只是在学习,我想编写高效的代码,因此如果您可以向我提出任何建议,将会很有帮助。

我想要这个输出(我得到了):

Jozefína likes to go to here: Amsterdam ,Liverpool ,London.
Marek likes to go to here: Košice.
Jozef likes to go to here: Lisabon ,Vancouver.

PS:人物和城市的名称是完全随机的,因此您可以更改

我针对此问题的代码为

favourite_places = {
    "Jozefína": ["Amsterdam", "Liverpool", "London"],
    "Marek": ["Košice"],
    "Jozef": ["Lisabon", "Vancouver"]
}


for name in favourite_places:
    line = ""
    for place in favourite_places[name]:
        if len(favourite_places[name]) == 1:
            line = place
        else:
            line += place + " ,"
    if line[-1] == ",":
        line = line[0:-2]
    print(f"{name} likes to go to here: {line}.")

最后,我想说一个句子,上面写着该人的名字和他或她喜欢去的地方(用逗号分隔)。

希望我能正确地描述问题。我只想优化我的代码。如有任何建议,我将不胜感激。

4 个答案:

答案 0 :(得分:3)

您缺少的是joinitems函数。 join将所有带有指定定界符的iterable联接起来。如果只有一项,则不会添加任何定界符。将字符串与++=串联通常被认为是不好的做法。字符串是不可变的,因此每个串联产生一个新的字符串,该字符串必须为其分配内存。为了避免这种情况,您可以首先将字符串的所有部分收集到list中(您已经将其作为输入),然后将它们连接起来。

items()返回字典(键,值)的元组。

favourite_places = {
    "Jozefína": ["Amsterdam", "Liverpool", "London"],
    "Marek": ["Košice"],
    "Jozef": ["Lisabon", "Vancouver"]
}


for name, places in favourite_places.items():
    print(f"{name} likes to go to here: {', '.join(places)}.")

答案 1 :(得分:1)

我想到的最简单的方法是这样的:

for name, places in favourite_places.items():
  print(f'{name} likes to go here: {", ".join(places)}.')

.items()返回字典中的(键,值)元组列表,这些元组被解构为名称和位置,然后", ".join(places)将返回一个字符串,该字符串将列表中的每个元素分隔开放在逗号之间,如果只有一个元素,则会自动将其忽略。

答案 2 :(得分:0)

尝试使用replace

for name, places in favourite_places.items():  
    print(name + " likes to go to here: " + str(places).replace('[', '').replace("'", "").replace(']', ''))

答案 3 :(得分:0)

这是一些改进:

favourite_places = {
    "Jozefína": ["Amsterdam", "Liverpool", "London"],
    "Marek": ["Košice"],
    "Jozef": ["Lisabon", "Vancouver"]
}


for name, place in favourite_places.items():
    line = ', '.join(place)
    print(f'{name} likes to go to here: {line}')