1

次のような一連のタプルがあります。

[(0.0, 0.25), (0.25, 0.25), (0.5, 0.5), (1.0, 0.25), (1.25, 0.75), (2.0, 1.0)]

分割シーケンスの最初のタプルの最初の要素が整数になるように、このシーケンスを分割したいと思います。

[[(0.0, 0.25), (0.25, 0.25), (0.5, 0.5)],
 [(1.0, 0.25), (1.25, 0.75)],
 [(2.0, 1.0)]]

で何かを書こうとしましたfilter(sequence, lambda x: x[0].is_integer())が、分割シーケンスの最初のタプルしか取得できませんでした。これどうやってするの?

4

5 に答える 5

1

私のような単純な人のために;)

a = [(0.0, 0.25), (0.25, 0.25), (0.5, 0.5), (1.0, 0.25), (1.25, 0.75), (2.0, 1.0)]
key, value = zip(*a)

index = 0
output = []
index_dict = {}
for i in range(0, len(key)):
    k, v = key[i], value[i]
    if int(k) in index_dict:
            output[index_dict[int(k)]].append((k, v))
    else:
            index_dict[int(k)] = index
            output.append([(k, v)])
            index += 1
于 2013-09-12T13:34:26.143 に答える
0

最初のタプルの最初の要素は整数であると仮定します。

reduce()関数を使用して、1 行で解決し、リストを 1 回パスすることができます。

>>> l = [(0.0, 0.25), (0.25, 0.25), (0.5, 0.5), (1.0, 0.25), (1.25, 0.75), (2.0, 1.0)]
>>> reduce(lambda acc, x: acc + [[x]] if x[0].is_integer() else acc[:-1] + [acc[-1] + [x]], l, [])
[[(0.0, 0.25), (0.25, 0.25), (0.5, 0.5)], 
[(1.0, 0.25), (1.25, 0.75)], 
[(2.0, 1.0)]]
于 2013-09-12T12:03:17.863 に答える
0

これは非常に簡単で、それほど美しくはありませんが、機能します。

from itertools import takewhile
from pprint import pprint


l = [(0.0, 0.25), (0.25, 0.25), (0.5, 0.5), (1.0, 0.25), (1.25, 0.75), (2.0, 1.0)]

result = []
i = 0
while i < len(l):
    item = [l[i]] + list(takewhile(lambda x: x[0] % 1, l[i + 1:]))
    result.append(item)
    i += len(item)

pprint(result)

プリント:

[[(0.0, 0.25), (0.25, 0.25), (0.5, 0.5)],
 [(1.0, 0.25), (1.25, 0.75)],
 [(2.0, 1.0)]]
于 2013-09-12T12:04:13.167 に答える