Pythonはリスト構造における値をデクリメントする方法をまとめます。


今日は一つの問題がありました。同僚が気の向くままに提示してくれて、itertools.groupbyという関数を使いました。でも、これは結局役に立ちませんでした。
問題はリストの中のニュースidを重くして、重いものにしたら順序が変わらないようにすることです。
直感的な方法
一番簡単な考え方は:

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
  if id not in news_ids:
    news_ids.append(id)

print news_ids

これもいいですが、すっきりしないように見えます。
setを使う
もう一つの解決策はsetを使うことです。

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
このような結果は元の順序を維持していない。
索引で並べ替え
最後にこの方法で解決します。

ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)
itertools.groubyを使う
記事は最初からitertools.groubyに言及していますが、リストの順序を考慮しないとこれが使えます。

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)

for k, g in it:
  print k

itertools.groupbyの原理についてはここを見ることができます。http://docs.python.org/2/library/itertools.html#itertools.groupby
reduceを使う
ユーザーreatlkは別の解決策にメッセージを残しました。補足して説明します。

In [5]: ids = [1,4,3,3,4,2,3,4,5,6,1]

In [6]: func = lambda x,y:x if y in x else x + [y]

In [7]: reduce(func, [[], ] + ids)
Out[7]: [1, 4, 3, 2, 5, 6]

上は私がipythonで実行しているコードです。その中のlamda x,y:x if y in x else x+[y]はlamda x,y:y in x or x+[y]に相当します。
発想とは、まずidsを[],1,4,3,...]に変えて、reduceの特性を利用することです。reduce説明はここを参照してください。http://docs.python.org/2/library/functions.html#reduce