【问题标题】:How do you check and ensure that the same input isn't stored in the dictionary twice?您如何检查并确保相同的输入不会两次存储在字典中?
【发布时间】:2021-10-20 19:26:46
【问题描述】:

所以我在我目前参与的挑战中回答这个问题

问题: 跟上最好的流媒体很难,因此您决定向您的朋友询问订阅建议。 编写一个程序来帮助跟踪要观看的流媒体。您的程序应该询问朋友的姓名和他们推荐的流媒体,直到推荐 5 个不同的流。不能多次推荐每个流。 一旦推荐了 5 个不同的流,它应该打印流列表和推荐它们的朋友。

注意:朋友可以推荐多个流。

如果有人推荐了一个已经被推荐的流。程序打印:Someone else already recommended that.

这是我所拥有的:

playlist = {}

while len(playlist) < 5:
  name = input('Friend: ')
  stream = input('Which stream did they recommend? ')
  print (f'{name} recommended {stream}!')
  playlist[name] = stream
  if stream in playlist:
    playlist = playlist + ""

  else:
playlist = playlist + stream
print('Playlist complete! Subscribe to:')
for name, stream in playlist.items():
  print(f'{stream}: recommended by {name}')

我想检查同一个流是否被推荐了两次并打印someone else already recommended that

这是输出的样子:

【问题讨论】:

标签: python python-3.x


【解决方案1】:

所有字典都允许您使用dict.values() 访问可迭代对象。这样,您可以使用 if 语句检查流是否在字典的值中:

if stream in playlist.values():
   ... # Do stuff

所以一个完整的解决方案看起来像这样:

playlist = {}

while len(playlist) < 5:
    name = input('Friend: ')
    stream = input('Which stream did they recommend? ')
    if stream in playlist.values():
        print("Someone else already recommended that")
    else:
        print (f'{name} recommended {stream}!')
        playlist[name] = stream

print('Playlist complete! Subscribe to:')
for name, stream in playlist.items():
    print(f'{stream}: recommended by {name}')

【讨论】:

  • 注意:与翻转字典相比,这是二次运行时复杂度,它是线性的
  • @OneCricketeer 交换本身实际上并没有更快。两者都在同一个while循环中(否则解决方案不能保证有5个)并且需要使用in关键字进行相同的查找,在我的情况下遍历整个dict.values()列表和整个dict.keys()列表在你的情况下。我仍然认为交换它对可用性更好,因为它感觉更直观。除非你还包括底部的for 循环,我认为它是多余的,但我留下了,因为它是 OP 代码的一部分,在这种情况下你是对的。
  • 我的印象是检查键集是恒定的时间?或者你是说隐式调用in 或调用.keys() 仍然会在线性时间内收集一个集合对象?
  • @OneCricketeer nvm 你是对的。这是一个完全不同的系统。进行本机迭代使用完全不同的方法。我的印象是 python 只是在查找别名,但它不是 stackoverflow.com/questions/44244281/…
【解决方案2】:

您似乎已经知道如何检查字典中的内容,但您需要反转映射,以便防止重复键并确保 len(playlist) 实际上是 5 个唯一流,而不是 5 个朋友(因为朋友可以推荐多个流)

name = input('Friend: ')
stream = input('Which stream did they recommend? ')
if stream not in playlist:
    playlist[stream] = name 
    print (f'{name} recommended {stream}!')
else:
    print('someone else recommended that')

如果您想存储每个推荐的所有朋友姓名,即使他们重复推荐,请在值中使用列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多