python中的列表操作
您已经给出了一个列表。列表的长度可能会有所不同python中的列表操作,python,Python,您已经给出了一个列表。列表的长度可能会有所不同 As an example: 1. ll = [1,2,3] 2. ll = [1,2,3,4] 3. ll = [1,2] 4. ll = [] 我想把值存储在三个变量中 var1,var2,var3 = None,None,None If ll[0] exists then var1 = ll[0] If ll[1] exists then var2 = ll[1] If ll[3] exists then var3 = ll[2] 我
As an example:
1. ll = [1,2,3]
2. ll = [1,2,3,4]
3. ll = [1,2]
4. ll = []
我想把值存储在三个变量中
var1,var2,var3 = None,None,None
If ll[0] exists then var1 = ll[0]
If ll[1] exists then var2 = ll[1]
If ll[3] exists then var3 = ll[2]
我已经编写了解决方案,但它包含if-else。我写的代码是:
var1,var2,var3 = None,None,None
if len(ll) == 1:
var1,var2,var3 = ll[0],None,None
elif len(ll) == 2:
var1,var2,var3 = ll[0],ll[1],None
else:
var1,var2,var3 = ll[0],ll[1],ll[2]
如果不使用IF/Else,有什么好方法可以解决这个问题。即使我不鼓励这样做:
var1, var2, var3 = ll[:3] + [None] * (3-min(3, len(ll)))
基本上,它用一个无的列表填充缺少的值。您可以使用解包:
ll = [1,2,3]
var1, var2, var3 = (ll + [None]*len(ll))[:3]
print var1
# 1
print var2
# 2
print var3
# 3
ll = [1,2]
var1, var2, var3 = (ll + [None]*len(ll))[:3]
print var1
# 1
print var2
# 2
print var3
# None
ll+[None]*len(ll)
通过添加[None,etc]
来添加(或删除)当前列表。None
s的数量取决于列表的长度
因此,例如,如果列表是[1]
,它会将[None,None]
添加到该列表中,因此解包不会引发错误,因为存在相同数量的元素
您可能最好使用一个条件,例如:
if len(ll) > 3:
var1, var2, var3 = ll[:3]
else:
var1, var2, var3 = ll + [None] * (3-len(ll))
试试这个片段
# You can use other values for this list
default_list = [None] * 3 # Same as None, None, None
var1, var2, var3 = ll[:len(default_list)] + default_list[len(ll):]
基本上,它所做的是创建一个与
default\u list
大小相同的列表,用default\u list
中的值填充任何缺失的索引,这可能是最简单的索引
var1, var2, var3 = (ll + [None] * 3)[:3]
由于到目前为止我们还没有基于itertools的解决方案:
import itertools as it
var1, var2, var3 = list(it.chain(ll, it.repeat(None, 3- len(ll))))[:3]
但这太荒谬了我会扩展它,允许任意的可编辑性,而不是依赖于能够切片,例如:
from itertools import chain, repeat, islice
a, b, c = islice(chain(your_iterable, repeat(None)), 3)
虽然,如果我不想这样解包,那么我会考虑使用dict
,但这会有稍微不同的语义:
var = dict(enumerate(islice(your_iterable, 3), start=1))
var[1] # first item (think of it as `var1`) or
var.get(1) # but get `None` if it wasn't "unpacked"
“
如果ll[3]存在,那么var3=ll[2]
”这是故意的还是打字错误?列表的长度可能会有所不同,但var1、var2、var3只需初始化三个变量?@Anurag:您的实际用例是什么?@Bruno,只想从列表中提取前三个值。并将其存储到数据库。@Anurag:您真的认为需要将这三个值绑定到本地变量以“将它们存储到数据库”吗?如果len(ll)>3,这将中断。您必须使用(ll+[None]*(3-len(ll))[:3]
instead@brunodesthuilliers谢谢你,在提供的示例中这不起作用。ll=[1,2,3,4]导致ValueError:太多的值无法解包
几乎同时发布了itertools
。。。不过方法有些不同:)