我在python中有一个列表,它包含字母和数字元素,比如list = ["a", 1, 2, 3, "b", 4, 5, 6]
,我想把它分成2个列表,包含跟随字母字符的数字,所以{{1} }和list1 = [1, 2, 3]
。 list2 = [4, 5, 6]
和a
元素的顺序可能相反,但一般来说,我希望将b
和a
元素后面的数字元素存储在不同的列表中。我想出的最简单的解决方案是创建一个条件循环:
b
我会 #Generating a list for numeric elements following "a":
for e in list[list.index("a")+1:]:
if not str.isdigit(e):
break
else:
list1.append(e)
和list2
之后的数字元素类似地执行此操作。
但是会有更优雅的解决方案吗?我是Python的新手,但我看过漂亮的单线结构,在我的情况下会有类似的东西吗?提前致谢。
答案 0 :(得分:4)
这样的事,也许?
>>> import itertools
>>> import numbers
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6]
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number))
>>> result = [[x for x in group_iter] for is_number, group_iter in groups if is_number]
>>> result
[[1, 2, 3], [4, 5, 6]]
这是一个不那么“性感”的版本,它输出一对元组对(group_key, group_numbers)
的列表:
>>> import itertools
>>> import numbers
>>> lst = ["a", 1, 2, 3, "b", 4, 5, 6]
>>> groups = itertools.groupby(lst, key=lambda x: isinstance(x, numbers.Number))
>>> group_key = None
>>> result = []
>>> for is_number, group_iter in groups:
... if not is_number:
... for x in group_iter:
... group_key = x
... else:
... result.append((group_key, [x for x in group_iter]))
>>> result
[('a', [1, 2, 3]), ('b', [4, 5, 6])]
请注意,它是一个快速而又脏的版本,它希望输入数据格式正确。
答案 1 :(得分:3)
这里有一个功能性的方法:
>>> l = ["a", 1, 2, 3, "b", 4, 5, 6]
>>> dig = [x for (x, y) in enumerate(l) if type(y) is str] + [len(l)]
>>> dig
[0, 4, 8]
>>> slices = zip(map(lambda x:x+1, dig), dig[1:])
>>> slices
[(1, 4), (5, 8)]
>>> lists = map(lambda (i, e): l[i:e], slices)
>>> lists
[[1, 2, 3], [4, 5, 6]]
首先我们得到字母的索引,注意我们需要列表的大小来知道它的结尾:
[x for (x, y) in enumerate(l) if type(y) is str] + [len(l)]
然后我们得到列表所在的一对切片:
zip(map(lambda x:x+1, dig), dig[1:])
最后,我们从原始列表中获取每个切片:
map(lambda (i, e): l[i:e], slices)
答案 2 :(得分:0)
您可以使用切片:
list = ["a", 1, 2, 3, "b", 4, 5, 6]
lista = list[list.index('a')+1:list.index('b')]
listb = list[list.index('b')+1:]
答案 3 :(得分:0)
另一种方法(仅限Python 3):
def chunks(values, idx=0):
''' Yield successive integer values delimited by a character. '''
tmp = []
for idx, val in enumerate(values[1:], idx):
if not isinstance(val, int):
yield from chunks(values[idx + 1:], idx)
break
tmp.append(val)
yield tmp
>>> values = ['a', 1, 2, 3, 'b', 4, 5, 6]
>>> list(chunks(values))
[[4, 5, 6], [1, 2, 3]]