在 Python 中填写大小不均的列表
Fill in uneven sized lists in Python
我有一个 2D-List 包含不等大小的长度,像这样:
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
如果元素大小小于 3,我使用此代码插入 0:
newlist = [val.insert(1,0) for val in lst if len(val)<3]
但我只是得到了一个空的newlist
,而原来的lst
被插入了一个0
。
>>> lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
>>> newlist = [val.insert(1,0) for val in lst if len(val)<3]
>>> newlist
[None]
>>> lst
[[1, 2, 3], [-1, 2, 4], [0, 0, 2], [2, -3, 6]]
我不想使用旧的 lst
列表值,因为如果修改后的值可以 return 到 newlist
,我可以直接使用它转换为这样的 DataFrame:
df = pd.DataFrame([val.insert(1,0) for val in lst if len(val)<3])
那么,我该怎么做呢?并且希望代码能写成一行
您得到 None 作为 newlist
的值,因为 val.insert(1,0)
returns None
作为输出。
试试这个,
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
new_list = [i + [0] if len(i) < 3 else i for i in lst]
print(new_list)
输出-
[[1, 2, 3], [-1, 2, 4], [0, 2, 0], [2, -3, 6]]
您的代码中的问题是 val.insert(1,0)
就地改变了列表,并且 returns None.
我的建议如下。它可能不完全是您期望的输出(因为它 returns 一个元组数组),但它可能会满足您的目的:
from itertools import zip_longest
list(zip(*zip_longest(*lst, fillvalue=0)))
# output:
# [(1, 2, 3), (-1, 2, 4), (0, 2, 0), (2, -3, 6)]
解释:
[zip_longest][1]
聚合每个序列的元素,如果它们的长度不均匀,则缺失值为filled-in和fillvalue
。通过使用 *
运算符,每个内部列表都作为单独的参数传递给函数。
完成zip_longest,补完缺的,我又在zip了(结果被第一次zip转置了)
保持简单。您原来的方法是有效的,但只使用经典循环:
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
# if needed, keep a copy
# old_lst = lst.copy()
for l in lst:
if len(l)<3:
l.insert(1,0)
pd.DataFrame(lst)
输出:
0 1 2
0 1 2 3
1 -1 2 4
2 0 0 2
3 2 -3 6
我有一个 2D-List 包含不等大小的长度,像这样:
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
如果元素大小小于 3,我使用此代码插入 0:
newlist = [val.insert(1,0) for val in lst if len(val)<3]
但我只是得到了一个空的newlist
,而原来的lst
被插入了一个0
。
>>> lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
>>> newlist = [val.insert(1,0) for val in lst if len(val)<3]
>>> newlist
[None]
>>> lst
[[1, 2, 3], [-1, 2, 4], [0, 0, 2], [2, -3, 6]]
我不想使用旧的 lst
列表值,因为如果修改后的值可以 return 到 newlist
,我可以直接使用它转换为这样的 DataFrame:
df = pd.DataFrame([val.insert(1,0) for val in lst if len(val)<3])
那么,我该怎么做呢?并且希望代码能写成一行
您得到 None 作为 newlist
的值,因为 val.insert(1,0)
returns None
作为输出。
试试这个,
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
new_list = [i + [0] if len(i) < 3 else i for i in lst]
print(new_list)
输出-
[[1, 2, 3], [-1, 2, 4], [0, 2, 0], [2, -3, 6]]
您的代码中的问题是 val.insert(1,0)
就地改变了列表,并且 returns None.
我的建议如下。它可能不完全是您期望的输出(因为它 returns 一个元组数组),但它可能会满足您的目的:
from itertools import zip_longest
list(zip(*zip_longest(*lst, fillvalue=0)))
# output:
# [(1, 2, 3), (-1, 2, 4), (0, 2, 0), (2, -3, 6)]
解释:
[zip_longest][1]
聚合每个序列的元素,如果它们的长度不均匀,则缺失值为filled-in和fillvalue
。通过使用 *
运算符,每个内部列表都作为单独的参数传递给函数。
完成zip_longest,补完缺的,我又在zip了(结果被第一次zip转置了)
保持简单。您原来的方法是有效的,但只使用经典循环:
lst = [[1,2,3],[-1,2,4],[0,2],[2,-3,6]]
# if needed, keep a copy
# old_lst = lst.copy()
for l in lst:
if len(l)<3:
l.insert(1,0)
pd.DataFrame(lst)
输出:
0 1 2
0 1 2 3
1 -1 2 4
2 0 0 2
3 2 -3 6