在 Python 中将列表的列表连接为列表

为什么我们需要将列表的列表连接为列表

列表列表是一种二维格式,也称为嵌套列表,包含多个子列表。列表是 Python 中最灵活的数据结构之一,因此将列表列表加入单个一维列表可能是有益的。

在这里,我们将这个列表列表转换为一个单一结构,其中新列表将包含列表列表中每个子列表中包含的元素。在 Python 语言中,这个过程也称为展平。

包含所有元素的一维列表是一种更好的方法,因为:

  1. 它使代码清晰易读,以获得更好的文档,因为从单一结构比二维结构更容易阅读。
  2. 一维列表在数据科学应用程序中很有帮助,因为你可以快速读取、过滤或删除列表中的项目。
  3. 当你希望基于集合论过滤数据时,列表也是首选。

使用 for 循环将列表加入列表

将列表列表转换为一维列表的最简单方法是实现嵌套 for 循环,其中包含不同元素的 if 条件。你可以通过以下方式做到这一点:

Listoflists = [[100,90,80],[70,60],[50,40,30,20,10]] #List of Lists

mylist = [] #new list

for a in range(len(Listoflists)): #List of lists level
    for b in range (len(Listoflists[a])): #Sublist Level
        mylist.append(Listoflists[a][b]) #Add element to mylist

print("List of Lists:",Listoflists)
print("1-D List:",mylist)

输出:

List of Lists: [[100, 90, 80], [70, 60], [50, 40, 30, 20, 10]]
1-D List: [100, 90, 80, 70, 60, 50, 40, 30, 20, 10]

在上面的代码片段中,我们使用了嵌套的 for 循环。第一个循环选择主列表中的每个元素并检查它是否是列表类型。

如果子元素是一个列表,它会启动另一个 for 循环来迭代这个子列表并将其值添加到新列表中。否则,它会附加在该位置找到的单个元素。

使用嵌套的 for 循环适用于规则和不规则的列表列表,但这是一种蛮力方法。

使用列表推导将列表加入列表

将嵌套列表转换为单个列表的另一种方法是使用列表推导。列表推导式提供了易于理解的单行干净代码,可以使用其他结构(如字符串、数组、嵌套列表等)创建全新的列表。

让我们看看如何使用列表推导来解决我们的问题:

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]]

#mylist defined using list comprehension
mylist = [item for sublist in listoflists for item in sublist]

print('List of Lists', listoflists)
print('1-D list', mylist)

输出:

List of Lists [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
1-D list ['Sahildeep', 'Dhruvdeep', 14.12, 8.6, 14.01, 100, 100]

在上面的代码片段中,我们指定创建一个新列表,其中包含原始列表列表中每个子列表的每个项目提供的元素。你还可以将包含各种数据类型元素的子列表组合到一维列表中。

Python 中使用递归将列表的列表连接为列表

递归提供了另一种在 python 中展平列表列表的方法。让我们看看如何实现递归以从列表列表创建单个列表:

def to1list(listoflists):

    if len(listoflists) == 0:
        return listoflists

    if isinstance(listoflists[0], list):
        return to1list(listoflists[0]) + to1list(listoflists[1:])

    return listoflists[:1] + to1list(listoflists[1:])


print("MyList:",to1list([["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]]))

输出:

MyList: ['Sahildeep', 'Dhruvdeep', 14.12, 8.6, 14.01, 100, 100]

在上面的代码片段中,我们定义了一个名为 to1list 的递归函数,它接受一个列表列表,listoflists 是它的参数。如果列表列表包含单个元素,则按原样返回。

否则,使用带有 isinstance() 的 if 语句来检查列表列表中第 0 个位置的列表是否为列表。

如果为真,那么我们返回 [0] 处子列表的值并再次调用我们的函数 to1list,但这一次,跳过第 0 个位置并通过指定切片并传递子列表从第一个位置开始-list 作为参数。

现在让我们看看如何使用内置函数将嵌套列表连接到列表中。

使用内置 Python 函数将列表的列表连接为列表

我们可以使用 sum() 函数和 lambda 函数来连接 Python 中的列表列表。

使用 sum() 函数将列表的列表连接为列表

你可以使用内置的 sum 函数从列表列表中创建一维列表。

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]] #List to be flattened

mylist = sum(listoflists, [])

print("List of Lists:",listoflists)
print("My List:",mylist)

输出:

List of Lists: [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
My List: ['Sahildeep', 'Dhruvdeep', '14.12', '8.6', '14.01', '100', '100']

在上面的程序中,sum 函数传递了两个参数;第一个是它将迭代的列表列表,第二个是我们最初为空的一维列表的开始。

使用 Lambda 函数加入列表列表

你还可以使用 lambda(即匿名函数)将列表列表转换为列表。让我们看一个代码示例:

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]] #List to be flattened

to1list = lambda listoflists:[element for item in listoflists for element in to1list(item)] if type(listoflists) is list else [listoflists]

print("List of lists:", listoflists)
print("MyList:", to1list(listoflists))

输出:

List of lists: [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
MyList: ['Sahildeep', 'Dhruvdeep', 14.12, 8.6, 14.01, 100, 100]

在上面的程序中,我们定义了一个 lambda 函数,它迭代项目的每个元素,即列表列表中的子列表,并使用 to1list(item) 将该元素添加到单个列表中。

让我们看看如何使用 Python 库将列表列表转换为一维列表。

使用 Functools 将列表的列表连接为列表

在 Python 中将二维列表转换为一维列表的最快方法之一是使用其 Functools 模块,该模块提供的函数可以有效地处理更高或复杂的函数。

我们可以使用 Functools 模块中提供的 reduce() 函数将一个列表加入到一个列表中,如下代码所示:

import operator
import functools

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]]
#mylist using functools
mylist = functools.reduce(operator.iconcat, listoflists, [])

print('List of Lists', listoflists)
print('1-D list', mylist)

输出:

List of Lists [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
1-D list ['Sahildeep', 'Dhruvdeep', 14.12, 8.6, 14.01, 100, 100]

在上面的代码片段中,新的一维列表是用 reduce() 函数定义的,该函数使用 operator.iconcat 函数连接我们从左到右移动的列表列表的子列表中的所有元素.

最好记住为 functools 和 operator 添加导入,因为这种方法需要两者。

使用 Chain() 方法将列表的列表连接为列表

另一个 Python 库,称为 Itertools,包含一个 chain() 方法,你可以使用该方法将列表列表转换为一维列表。让我们看看如何:

import itertools

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]] #List to be flattened

mylist = list(itertools.chain(*listoflists))

print("List of Lists:",listoflists)
print("My List:",mylist)

输出:

List of Lists: [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
My List: ['Sahildeep', 'Dhruvdeep', 14.12, 8.6, 14.01, 100, 100]

在上述程序中,chain() 方法用于迭代列表列表中的所有子列表,并返回包含所有子列表的所有元素的单个可迭代列表。

使用 Numpy 模块将列表的列表连接为列表

Numpy 库提供了连接子字符串并将它们展平为单个一维列表的函数。让我们看看如何使用 numpy.concatenate() 将嵌套列表转换为列表:

import numpy

listoflists = [["Sahildeep", "Dhruvdeep"], [14.12,8.6,14.01], [100,100]] #List to be flattened

mylist = list(numpy.concatenate(listoflists).flat)

print("List of Lists:",listoflists)
print("My List:",mylist)

输出:

List of Lists: [['Sahildeep', 'Dhruvdeep'], [14.12, 8.6, 14.01], [100, 100]]
My List: ['Sahildeep', 'Dhruvdeep', '14.12', '8.6', '14.01', '100', '100']

在上面的代码片段中,我们使用了列表列表,与上面的程序相同,并使用 NumPy 的 concatenate() 和 flat() 函数创建了一个名为 mylist 的新列表。