2014-05-12 34 views
1

我也有類似的類型的字典列表中顯示的圓形列表如何從計算出的指數

d = [{10: "a"}, {20: "b"}, {30: "c"}] 

該列表由按鍵排序。我不附格式或數據類型 - 我建這個名單由反正外部源(這是說,它是可以改變的,如果有幫助)

我也有一個變量x範圍從0100

我想得到的是列表d重新排列(或重建或複製到別處),從大於x的第一個鍵開始。舉例來說(EDITED,對不起,我提出在最初的例子有誤)

  • 如果x == 2然後d = [{10: "a"}, {20: "b"}, {30: "c"}]
  • 如果x == 12然後d = [{20: "b"}, {30: "c"}, {10: "a"}]
  • 如果x == 22然後d = [{30: "c"}, {10: "a"}, {20: "b"}]
  • 如果x == 32然後d = [{10: "a"}, {20: "b"}, {30: "c"}]

我稱之爲「循環」,因爲它代表「下一個len(d)元素與key > x「以封閉的方式。

我將以鏈接if的形式執行此操作,並且每次都手動創建列表(上述示例涵蓋了這些列表)。除了是一個可怕的解決方案,它不是完全可擴展的,如果len(d)變大(現在是3所以最壞的情況下,我會去鏈接if)。

什麼是Pythonic解決方案來處理這個問題?

+1

是否所有的字典都有一個鍵?你有沒有考慮過使用OrderedDict或者元組列表? – jonrsharpe

+0

是的,他們確實有一個唯一的鑰匙。我沒有考慮OrderedDict或元組列表,但是我可以將數據類型更改爲除了我的if之外的其他解決方案。 – WoJ

+0

字典中的所有密鑰都是獨一無二的,事實上只有一個令我感到驚訝。這將需要更多的信息來確定最佳的數據結構。你的例子不符合描述*「從大於'x'的第一個鍵開始」*。 – jonrsharpe

回答

0

我會用切片和enumerate

for index, subdict in enumerate(d): 
    if list(subdict)[0] > x: 
     d = d[index:] + d[:index] 
     break 

是否有您需要的更好的數據結構?也許,但沒有更多的信息,很難確定它會是什麼。正如你所說,你所有的子詞典中的鍵都在列表中是唯一的,你應該看看collections.OrderedDict - 你可以將所有的數據放在同一個單一結構中。

0

這給了30首當x是22,因爲30是第一個關鍵> 22:

d = [{10: "a"}, {20: "b"}, {30: "c"}] 
dd = d * 2 

for x in [2, 12, 22, 32, 42]: 
    for i, h in enumerate(dd): 
     k, v = h.items()[0] 
     if k > x or i >= len(d): break 
    print x, dd[i:i+len(d)] 

輸出:

2 [{10: 'a'}, {20: 'b'}, {30: 'c'}] 
12 [{20: 'b'}, {30: 'c'}, {10: 'a'}] 
22 [{30: 'c'}, {10: 'a'}, {20: 'b'}] 
32 [{10: 'a'}, {20: 'b'}, {30: 'c'}] 
42 [{10: 'a'}, {20: 'b'}, {30: 'c'}] 

但由於列表進行排序,你可以做一個二進制搜索提高性能。

+0

謝謝 - 我意識到(也感謝jonrsharpe的評論),我在我的例子中犯了一個錯誤 – WoJ

0

您可以使用以下,但是,這適用於簡單的數據格式/類型。如果你的輸入更復雜,那麼你可能需要稍微調整一下。

d = [y for y in d if list(y)[0] > x] + [y for y in d if list(y)[0] <= x] 
1

沒有特別的理由,我想用一個列表理解來解決這個問題。這是我想出的:

>>> from itertools import product 
>>> d = [{10: "a"}, {20: "b"}, {30: "c"}] 
>>> for x in (2, 12, 22, 32): 
...  [e for i, e in product(range(2), d) 
...  if (0, x) < (i, next(iter(e))) <= (1, x)] 
... 
[{10: 'a'}, {20: 'b'}, {30: 'c'}] 
[{20: 'b'}, {30: 'c'}, {10: 'a'}] 
[{30: 'c'}, {10: 'a'}, {20: 'b'}] 
[{10: 'a'}, {20: 'b'}, {30: 'c'}]