1

私はPythonでリストのこのリストを持っています:

[[100,XHS,0],
[100,34B,3],
[100,42F,1],
[101,XHS,2],
[101,34B,5],
[101,42F,2],
[102,XHS,1],
[102,34B,2],
[102,42F,0],
[103,XHS,0],
[103,34B,4],
[103,42F,2]]

そして、各ID(最初の要素)の各リストの最後の要素を使用してリストの新しいリストを作成する最も効率的な方法(私は多くのデータを扱っています)を見つけたいと思います..サンプルリストについて上記の場合、私の結果は次のようになります。

[[0,3,1],
[2,5,2],
[1,2,0],
[0,4,2]]

これを Python で実装するにはどうすればよいですか? ありがとう

4

5 に答える 5

8

構築ブロックを分割した itertools アプローチ - 最後の要素を取得し、3 つにグループ化し、3 つのグループをリストに変換します...

from operator import itemgetter
from itertools import imap, izip

last_element = imap(itemgetter(-1), a)
in_threes = izip(*[iter(last_element)] * 3)
res = map(list, in_threes)
# [[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]

ただし、(純粋に 3 つの連続したアイテムのブロックではなく) 最初の要素で「グループ化」したいように見えるので、これに使用できますdefaultdict

from collections import defaultdict
dd = defaultdict(list)
for el in a:
    dd[el[0]].append(el[-1])

# defaultdict(<type 'list'>, {100: [0, 3, 1], 101: [2, 5, 2], 102: [1, 2, 0], 103: [0, 4, 2]})
于 2013-08-02T13:29:49.450 に答える
2

あなたはここで2つのことをしようとしています:

  • ネストされた各リストの最後の要素を取得します。
  • これらの要素は、ネストされた各リストの最初の要素でグループ化します。

リスト内包表記を使用して、ネストされた各リストの最後の要素を取得できます。

last_elems = [sublist[-1] for sublist in outerlist]

リスト全体が最初の要素 (id) でソートされている場合itertools.groupbyは、2 番目の部分を実行するために使用できます。

from itertools import groupby
from operator import itemgetter

[[g[-1] for g in group] for id_, group in groupby(outerlist, key=itemgetter(0))]

デモ:

>>> outerlist = [
...     [100,'XHS',0],
...     [100,'34B',3],
...     [100,'42F',1],
...     [101,'XHS',2],
...     [101,'34B',5],
...     [101,'42F',2],
...     [102,'XHS',1],
...     [102,'34B',2],
...     [102,'42F',0],
...     [103,'XHS',0],
...     [103,'34B',4],
...     [103,'42F',2]
... ]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> [[g[-1] for g in group] for id_, group in groupby(outerlist, key=itemgetter(0))]
[[0, 3, 1], [2, 5, 2], [1, 2, 0], [0, 4, 2]]

ソートされていない場合は、最初にソートする必要があります ( を使用outerlist.sort(key=itemgetter))。または、ソートされたバージョンが他に必要ない場合は、collections.defaultdictグループ化のアプローチを使用します。

from collections import defaultdict

grouped = defaultdict(list)
for sublist in outerlist:
    grouped[sublist[0]].append(sublist[-1])

output = grouped.values()
于 2013-08-02T13:29:29.417 に答える
2
new_list = []
temp_list = []
counter = 1

for x in list:
  temp_list.extend(x[-1])
  if ((counter % 3) == 0):
    new_list.append(temp_list)
    temp_list = []
  counter += 1
print new_list
于 2013-08-02T13:27:42.957 に答える
0
l=[[100,'XHS',0],
[100,'34B',3],
[100,'42F',1],
[100,'XHS',0],
[100,'34B',30],
[100,'42F',10],
[100,'XHS',0],
[100,'34B',300],
[100,'42F',100]]

def chunks(l, n):
    for i in xrange(0, len(l), n):
        yield l[i:i+n]

印刷されます:

[[0, 3, 1], [0, 30, 10], [0, 300, 100]]
于 2013-08-02T13:31:49.763 に答える