2013-05-15 35 views
2

我有這樣的事情如何訂購字典從列表蟒蛇

mydict = OrderedDict({'a':'1', 'd':'2','f':'1', 'i':'2','m':'1', 'k':'2'}) 

現在假設我有列表像

l = [i,k]

所以我想根據名單上訂購mydict l。所以i,k將是前兩項,然後其他項目保持原來的順序

我想盡可能以最少的代碼做到這一點。在Python中

+1

你到現在爲止做了什麼?你想要的最小多少? –

+2

你確實明白,通過使用字典而不是列表,你會失去'OrderedDict'的初始訂單 – jamylak

+1

我無法在你的文章的任何位置找到'h'。 –

回答

5

使用itertools的unique_everseen配方。

def unique_everseen(iterable, key=None): 
    "List unique elements, preserving order. Remember all elements ever seen." 
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D 
    # unique_everseen('ABBCcAD', str.lower) --> A B C D 
    seen = set() 
    seen_add = seen.add 
    if key is None: 
     for element in ifilterfalse(seen.__contains__, iterable): 
      seen_add(element) 
      yield element 
    else: 
     for element in iterable: 
      k = key(element) 
      if k not in seen: 
       seen_add(k) 
       yield element 

>>> from itertools import * 
>>> lis = ["i","k"] 
>>> mydict = OrderedDict([('a', '1'), ('d', '2'), ('f', '1'), ('i', '2'), ('k', '2'), ('m', '1')]) 
# A list is used in creating the OrderedDict, a dict would lose initial order 
>>> OrderedDict((key,mydict[key]) for key in unique_everseen(chain(lis,mydict))) 
OrderedDict([('i', '2'), ('k', '2'), ('a', '1'), ('d', '2'), ('f', '1'), ('m', '1')]) 
+0

當你使用'itertools'時,你應該使用'chain(lis,mydict)',它也適用於Py3 – jamylak

+0

@jamylak好點,解決方案已更新。 –