有人可以协助我在我的dict上正确放置if语句。我试着标记任何纽约的用户并让他们在字典中排在第一位。我能够按名称排序,我也需要,但不清楚如何标记任何纽约用户
names_states = {
'user1': 'CA',
'user2': 'NY',
'user7': 'CA',
'guest': 'MN',
}
for key in sorted(names_states.iterkeys()):
2 ... print "%s : %s" %(key, names_states[key])
3 ...
4 user1 : CA
5 user2 : NY
6 guest : MN
7 user7 : CA
答案 0 :(得分:4)
sorted(names_states.iteritems(), key=lambda x: (x[1] != 'NY', x[0]))
答案 1 :(得分:3)
这是一种方法,首先将NY值推到顶部,同时仍按用户名排序为第一个键,将状态排序为辅助键:
{'bill': 'NY',
'frank': 'NY',
'guest': 'MN',
'user1': 'CA',
'user2': 'NY',
'user7': 'CA'}
def keyFunc(x):
if names_states[x] == 'NY':
return (False, x)
return (x, names_states[x])
sorted(names_states.iterkeys(), key=keyFunc)
# ['bill', 'frank', 'user2', 'guest', 'user1', 'user7']
注意:坚持使用key
方法比定义自定义cmp
函数更快。关键功能只对每个项目运行一次,而cmp功能将在每个组合中运行。
答案 2 :(得分:2)
这就是你所要求的 - 所有新人首先按名称排序,然后按姓名排序。
names_states = {
'user1': 'CA',
'user2': 'NY',
'user7': 'CA',
'guest': 'MN',
}
def ny_compare(x, y):
if names_states[x] == 'NY':
if names_states[y] == 'NY':
return cmp(x,y)
else:
return -1
elif names_states[y] == 'NY':
return 1
return cmp(x,y)
for key in sorted(names_states.iterkeys(), cmp=ny_compare):
print "%s : %s" %(key, names_states[key])
答案 3 :(得分:1)
使用元组解包可以使其更清晰
sorted(names_states.iteritems(), key=lambda (name, state): (state != 'NY', name))
答案 4 :(得分:0)
for key, value in sorted(names_states.iteritems(),
key=lambda (key, value): ((0 if value == 'NY' else 1), key)):
print((key,value))
这里iteritems()获取字典中键/值对的迭代器。然后我们可以对这些键/值对进行排序。 lambda表达式创建了一组键,可以按照您的说法对列表进行排序。它通过返回元组来实现这一点,元组的第一个元素是一个基于值是否为'NY'
的数字。基本上,我使用的事实是元组按第一个元素排序,然后是第二个元素,依此类推。
也就是说,这开始变得非常混乱,所以你可能想找到一个更冗长,更清晰的方法来做到这一点。
您可能希望继承dict并添加一个额外的方法,以您希望的顺序公开键,值或键/值对。
这样你就可以拥有一些简单的东西:
names_states = MyDict({
'user1': 'CA',
'user2': 'NY',
'user7': 'CA',
'guest': 'MN',
})
for key, value in names_states.iteritems_with_given_values_first('NY'):
...
class MyDict(dict):
def __init__(self, *args, **kwargs):
super(MyDict, self).__init__(*args, **kwargs)
def iteritems_with_given_values_first(self, preferred_value):
for key, value in sorted(names_states.iteritems(),
key=lambda (key, value): ((0 if value == preferred_value else 1), key)):
yield key, value