进一步简化和缩短了简单的分组算法

时间:2015-08-01 09:02:33

标签: python algorithm

这是输入列表

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

我想知道这是否可以更简单(在较少的行数中完成)?

4 个答案:

答案 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]

我不确定这实际上是否更容易阅读; - )。