python dict。如果声明

时间:2012-05-12 23:19:53

标签: python python-2.7

有人可以协助我在我的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

5 个答案:

答案 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