这是输入列表
input_list = ['string','string','1','string','2','string','string','3','string','5']
这是所需的输出
[['string', 'string', '1'], ['string', '2'], ['string', 'string', '3'],
['string', '5']]
基本上,您将列表数据string
和(numeric data)
分组到列表列表中,每个列表包含第一个数字数据和遇到的先前字符串数据
一种可以实现此目的的简单算法
output_list = []
inner_list = []
for data in input_list:
inner_list.append(data)
if data.isdigit():
output_list.append(inner_list)
inner_list = []
print output_list
我想知道这是否可以更简单(在较少的行数中完成)?
答案 0 :(得分:3)
一张reduce
的班轮。 请勿使用。
reduce(lambda n, e: n[:-1]+[n[-1]+[e]] + ([[]] if e.isdigit() else []), input_list, [[]])[:-1]
答案 1 :(得分:3)
您可以先找到数字元素的索引,然后使用df1 <- cbind(df, Col2= c("A", "B", "B", "C", "A"))
fld1 <- c(fld, 'Col2')
sval1 <- c(sval, 'B')
创建所需的切片索引和切片列表:
zip
答案 2 :(得分:2)
尽管这是单线解决方案,但它并不简单,它更复杂:
input_list = ['string','string','1','string','2','string','string','3','string','5']
result = [s.split() for s in ' '.join([s+'\n' if s.isdigit() else s for s in input_list]).splitlines()]
print result
输出:
[['string', 'string', '1'], ['string', '2'], ['string', 'string', '3'], ['string', '5']]
这个复杂的代码是你想要的吗?
(注意错误:如果其中一个字符串应该已经包含\n
。如果你确定它不会出现在其中一个字符串中,你可以选择另一个字符。)
答案 3 :(得分:1)
如果你想要一个(有点邪恶的)基于reduce()
的版本:
def reduce_string_prefix(cur, item):
cur[-1].append(item)
if item.isdigit():
cur.append([])
return cur
input_list = ['string', 'string', '1', 'string', '2', 'string', 'string', '3', 'string', '5']
output_list = reduce(reduce_string_prefix, input_list, [[]])[:-2]
我不确定这实际上是否更容易阅读; - )。