gpt4 book ai didi

python - 在 None 上拆分列表并记录索引

转载 作者:太空狗 更新时间:2023-10-30 00:32:03 27 4
gpt4 key购买 nike

我有一个列表,它可以同时包含Nonedatetime 对象。我需要将其拆分为连续 datetime 对象的子列表,并需要在原始列表中记录该子列表的第一个 datetime 对象的索引。

例如,我需要能够转身

original = [None, datetime(2013, 6, 4), datetime(2014, 5, 12), None, None, datetime(2012, 5, 18), None]

进入:

(1, [datetime.datetime(2013, 6, 4, 0, 0), datetime.datetime(2014, 5, 12, 0, 0)])
(5, [datetime.datetime(2012, 5, 18, 0, 0)])

我尝试了两种方法。一个使用 find:

binary = ''.join('1' if d else '0' for d in original)
end = 0
start = binary.find('1', end)
while start > -1:
end = binary.find('0', start)
if end < 0:
end = len(binary)
dates = original[start:end]
print (start, dates)
start = binary.find('1', end)

还有一个使用groupby:

from itertools import groupby
for key, group in groupby(enumerate(original), lambda x: x[1] is not None):
if key:
group = list(group)
start = group[0][0]
dates = [t[1] for t in group]
print (start, dates)

但对我来说,两者似乎都不过分 Pythonic。有没有更好的办法?

最佳答案

我会使用生成器来生成元素,封装分组:

from itertools import takewhile

def indexed_date_groups(it):
indexed = enumerate(it)
for i, elem in indexed:
if elem is not None:
yield (
i, [elem] + [v for i, v in takewhile(
lambda v: v[1] is not None, indexed)])

这里我用了itertools.takewhile()一旦我们找到一个初始的 not-None 对象,就生成子列表。

当然,您仍然可以使用 itertools.groupby() 执行相同的操作:

from itertools import groupby

def indexed_date_groups(it):
for key, group in groupby(enumerate(it), lambda v: v[1] is not None):
if key:
indices, elems = zip(*group)
yield indices[0], elems

演示:

>>> list(indexed_date_groups(original))
[(1, [datetime.datetime(2013, 6, 4, 0, 0), datetime.datetime(2014, 5, 12, 0, 0)]), (5, [datetime.datetime(2012, 5, 18, 0, 0)])]
>>> original = [None, datetime(2013, 6, 4), datetime(2014, 5, 12), None, None, datetime(2012, 5, 18), None]
>>> for index, group in indexed_date_groups(original):
... print index, group
...
1 [datetime.datetime(2013, 6, 4, 0, 0), datetime.datetime(2014, 5, 12, 0, 0)]
5 [datetime.datetime(2012, 5, 18, 0, 0)]

关于python - 在 None 上拆分列表并记录索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24783105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com