2013-03-11 64 views
0

說我有劃時代的時間以下按鍵詞典:查找Python字典的所有鍵> =整數

dict = { 
    "1363017884": "some val", 
    "1363033813": "another val", 
} 

我想找個大於說1363033000所有鍵(在這種情況下,只有1363033813將匹配) 。我有一個for循環來在每一個關鍵,但這似乎如此低效:

for epoch,value in dict.iteritems(): 
    if int(epoch) >= 1363033000: 
    do something interesting 
+0

小心:你已經在你的例子中重新定義了''dict''內置類。儘量避免使用像''file'',''dict'',''list'',''set'這樣的名字,否則你將無法像預期的那樣在代碼中使用它們。 – 2013-03-11 21:25:21

+0

@BalthazarRouberol在我的代碼中,我使用了一個獨特的變量,感謝您的高舉! – somecallmemike 2013-03-12 03:21:59

+0

絕對的,在這種情況下,它不會引起任何問題,但這只是一個好習慣。 – 2013-03-12 09:11:46

回答

7

循環在字典是你唯一真正的選擇,有沒有更有效的方法。

或者你可以使用不同的數據結構;例如,存儲與btree結構中的值相連的整數將使搜索大於或小於給定搜索值的鍵效率更高。

0

您可以稍微修改code from here以添加large_keys屬性。現在,每當這些大紀元中的一個被添加時,字典就會跟蹤它們。當你想迭代它們時,你可以簡單地遍歷該屬性。

class MyUpdateDict(dict): 
    def __init__(self, *args, **kwargs): 
     self.large_keys = [] 
     self.update(*args, **kwargs) 

    def __setitem__(self, key, value): 
     # optional processing here 
     if int(key)>1363033000: 
      self.large_keys.append((key,value)) 
     super(MyUpdateDict, self).__setitem__(key, value) 

    def update(self, *args, **kwargs): 
     if args: 
      if len(args) > 1: 
       raise TypeError("update expected at most 1 arguments, got %d" % len(args)) 
      other = dict(args[0]) 
      for key in other: 
       self[key] = other[key] 
     for key in kwargs: 
      self[key] = kwargs[key] 

    def setdefault(self, key, value=None): 
     if key not in self: 
      self[key] = value 
     return self[key] 

這可能過於簡單化,因爲大值是硬編碼的,但您可以修改以使其更適合。

0

如果你有數字和字符串作爲字典鍵首先做

myStringsList = [s for s in dictFromFile.keys() if s.isdigit()] 

這會給你的數字作爲字符串列表。

然後字符串列表轉換爲int列表只得到>比X元素:

myFinalList = [s for s in map(int, mynewlist) if s > X] 

希望它能幫助!