Pythonはリスト構造における値をデクリメントする方法をまとめます。
今日は一つの問題がありました。同僚が気の向くままに提示してくれて、itertools.groupbyという関数を使いました。でも、これは結局役に立ちませんでした。
問題はリストの中のニュースidを重くして、重いものにしたら順序が変わらないようにすることです。
直感的な方法
一番簡単な考え方は:
setを使う
もう一つの解決策はsetを使うことです。
索引で並べ替え
最後にこの方法で解決します。
記事は最初からitertools.groubyに言及していますが、リストの順序を考慮しないとこれが使えます。
reduceを使う
ユーザーreatlkは別の解決策にメッセージを残しました。補足して説明します。
発想とは、まずidsを[],1,4,3,...]に変えて、reduceの特性を利用することです。reduce説明はここを参照してください。http://docs.python.org/2/library/functions.html#reduce
問題はリストの中のニュース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.groupbyreduceを使う
ユーザー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