我想请教您解释如何正确使用join()函数来正确打印列表中的字典元素。我没有找到任何关于这方面的好教程。我附上一个例子来说明我的意思:
meteor run
当然我知道上面的代码不起作用。我只是不明白这个功能。
答案 0 :(得分:2)
对于您正在尝试的内容,您并不是太过分了,但我并不认为您了解所有正在共同努力使您的代码示例完成的小部分他们应该做什么,并且由于这个原因,会出现一些小错误(语法错误)。
例如,您原来的词典列表应如下所示:
>>> players_list = [
... {'name': 'Tom', 'points': 2},
... {'name': 'Jerry', 'points': 3},
... {'name': 'Paul', 'points': 4}
... ]
注意字符串周围的附加引号,表示玩家的名字。然后,您可以使用Python的精彩列表推导来处理此列表。
>>> [player['name'] for player in players_list]
['Tom', 'Jerry', 'Paul']
>>> [(player['name'], player['points']) for player in players_list]
[('Tom', 2), ('Jerry', 3), ('Paul', 4)]
虽然后者可能更容易被认为是涉及dict方法的表达式:
>>> list(tuple(player.values()) for player in players_list)
[('Tom', 2), ('Jerry', 3), ('Paul', 4)]
所以如果你想要打印出你的第一个例子,"分数:[名字]([分]),[名字]([分]),......",首先你需要提出上面的列表以提供您的格式字符串。实际上,您可以在列表解析中应用格式:
>>> ['%s(%s)' % tuple(player.values()) for player in players_list]
['Tom(2)', 'Jerry(3)', 'Paul(4)']
现在你几乎拥有你想要的东西,你只需要标题"分数:"在前面和逗号分隔的字符串而不是Python列表,因此:
>>> print('Scores: %s' % ', '.join(_))
Scores: Tom(2), Jerry(3), Paul(4)
...其中_
是Python REPL中存储最后结果的典型变量。换句话说,一下子:
>>> print('Scores: %s' % ', '.join(list(tuple(player.values()) for player in players_list)))
Scores: Tom(2), Jerry(3), Paul(4)
如果你将它分解成更小的步骤并将它们组合在一起,我认为它更容易看到该怎么做。至于join
的作用,它非常简单:它将一个列表(一个可迭代的)写成一个字符串"加入"通过一些分隔符。在这种情况下,一旦您将列表变为合适的格式,加入的目的是通过在所有元素之间添加', '
将其写为逗号分隔的字符串。
应用这个逻辑,让第二个例子正常工作应该更简单。
正如评论中所述,我在排序方面有点幸运。在一个例子中,我指出player.values()
的等价性,如果你真的对所有的价值感兴趣,那么你不必逐个命名。但是,由于Python中的dict
未被排序,因此有时会使用播放器的名称反转积分,从而导致:
>>> list(tuple(player.values()) for player in players_list)
[(2, 'Tom'), (3, 'Jerry'), (4, 'Paul')]
对于更长的dicts,解决这个问题的方法是按照你想要的方式明确地对键进行排序。但是,假设在实际代码中仍然只有两个密钥,那么硬编码'硬编码就更有效率和可读性。然后按名称调用你想要的键:
>>> [(player['name'], player['points']) for player in players_list]
[('Tom', 2), ('Jerry', 3), ('Paul', 4)]
>>> print('Scores: %s' % ', '.join([(player['name'], player['points']) for player in players_list]))
Scores: Tom(2), Jerry(3), Paul(4)
答案 1 :(得分:2)
你基本上是正确的,但你没有正确设置你的元组。让我用括号向您展示Python如何评估它:
print("Scores: %s (%d)" % (','.join(player['player_name'], (player['player_points'] for player in players_list))))
你现在看到了吗? %s
的参数实际上是player['player_name']
,而%d
的参数是(player['player_points'] for player in players_list)
。你想要的是将列表的每个元素格式化为一个字符串并加入这些字符串。
因此,join
内的格式应如下所示:
print("Scores: " + ",".join("%s (%d)" % (player['player_name'], player['player_points'])
for player in player_list)
(它有点长,所以我把它分成两行)
答案 2 :(得分:1)
以前的回答者已经很好地解释了你的第一个print
,所以我会专注于第二个:
print("There Is a Draw Between %d players: %s " % (len(players_list), ','.join(player['name'] for player in players_list)))
>> There Is a Draw Between 2 players: Tom, Peter
首先,你需要找到一个平局的球员。为此,您可以使用collections.Counter
来计算有多少玩家获得分数:
from collections import Counter
scores = Counter(o['points'] for o in players_list) # generator expression
scores
是Counter({2: 2, 3: 1})
,这意味着有2个人有2分,1个人有3分。
得分相同的人有平局,所以:
scores_that_draws = {k for k, v in scores.items() if v > 1} # set comprehension
# I use set because its `in` implementation is fast
scores_that_draws
是{2}
,这意味着有两分的人有平局。
我们拥有所需的一切。现在我们可以判断哪些球员有平局:
# list comprehension, you can use set comprehension as well
draws = [o['name'] for o in players_list if o['points'] in scores_that_draw]
让我们最终写出所需的结果:
print('There is draw between: %d players: %s' % (len(draws), ', '.join(draws)))
答案 3 :(得分:0)
我已经更改了您的加入,因此玩家姓名和分数会在联接中连接起来。需要在连接内部进行连接,因为您需要为每个玩家创建一个条目。另外我还解决了一些语法错误。我引用了你的播放器名称,假设它们是实际字符串而不是变量,并且在第一次打印时将键更改为name
和points
。
players_list = [{'name': 'Tom',
'points': 2},
{'name': 'Jerry',
'points': 3},
{'name': 'Peter',
'points': 2}
]
print ("Scores: %s" % ', '.join("%s(%d)" % (player['name'], player['points']) for player in players_list))
#>> Scores: Tom(2), Jerry(3), Peter(2)
print("There Is a Draw Between %d players: %s " % (len(players_list), ','.join(player['name'] for player in players_list)))
#>> There Is a Draw Between 3 players: Tom,Jerry,Peter