Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的列表操作_Python - Fatal编程技术网

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
。。。不过方法有些不同:)