python:将元素组合在列表中

时间:2019-03-12 04:09:46

标签: python python-3.x

我目前正与itertools合作创建并返回一个列表,该列表的元素是包含原始列表中相同元素的连续运行的列表。

import itertools
it = [1, 1, 5, 5, 5, 'test', 'test', 5]

new = len(it)
for a in range(new):
  return [list(k) for a, k in itertools.groupby(it)] 

对于上面的示例,结果是:

[[1, 1], [5, 5, 5], ['test', 'test'], [5]]

不使用itertools可以实现吗?

3 个答案:

答案 0 :(得分:1)

说实话,一个简单的for循环可以完成这项工作,您甚至不必导入itertools

最简单的方法是使用以下方法:

it = [1, 1, 5, 5, 5, 'test', 'test', 5]
result = []
for (i, x) in enumerate(it):
  if i < 1 or type(x) != type(it[i - 1]) or x != it[i - 1]:
    result.append([x])
  else:
    result[-1].append(x)
print(result)

或者,以函数形式:

def type_chunk(it):
  result = []
  for (i, x) in enumerate(it):
    if i < 1 or type(x) != type(it[i - 1]) or x != it[i - 1]:
      result.append([x])
    else:
      result[-1].append(x)
  return result

然后您将使用如下功能:

print(type_chunk([1, 1, 5, 5, 5, 'test', 'test', 5]))

您甚至可以跳过类型检查,只寻找相等的值:

def type_chunk(it):
  result = []
  for (i, x) in enumerate(it):
    if i < 1 or x != it[i - 1]:
      result.append([x])
    else:
      result[-1].append(x)
  return result

祝你好运。

答案 1 :(得分:1)

您可以通过将列表自身压缩但填充float('nan')来对相邻项目进行配对,因为它不能等于任何对象,然后遍历压缩后的对将项目追加到最后一个子列表中的输出列表,并在相邻项不同时添加新的子列表:

output = []
for a, b in zip([float('nan')] + it, it):
    if a != b:
        output.append([])
    output[-1].append(b)

output变为:

[[1, 1], [5, 5, 5], ['test', 'test'], [5]]

答案 2 :(得分:1)

您可以查看itertools中的功能,以了解它们的工作方式。

这是一种清晰显示逻辑的方法(可以进一步简化):

def i_am_itertool():
    it = [1, 1, 5, 5, 5, 'test', 'test', 5]
    ret = []

    temp = []
    last = it[0]
    for e in it:
        if e == last:
            temp.append(e)
        else:
            ret.append(temp)  # Add previous group
            temp = [e]  # Start next group
            last = e
    ret.append(temp)  # Add final group
    return ret

print(i_am_itertool())

输出:

 [[1, 1], [5, 5, 5], ['test', 'test'], [5]]