4

你已经给出了一个清单。列表的长度可能会有所不同。

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 的情况下解决这个问题。

4

6 回答 6

12

应该是最简单的

var1, var2, var3 = (ll + [None] * 3)[:3]
于 2013-10-22T10:55:45.603 回答
1

您可以使用解包:

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]。s的数量None取决于列表的长度。

因此,例如,如果列表是[1],它将添加[None, None]到该列表中,因此解包不会引发错误,因为存在相同数量的元素。

你可能最好使用条件,也许是这样的:

if len(ll) > 3:
    var1, var2, var3 = ll[:3]
else:
    var1, var2, var3 = ll + [None] * (3-len(ll))
于 2013-10-22T10:48:36.850 回答
1

我会去扩展它以允许任意迭代而不是依赖于能够切片,例如:

from itertools import chain, repeat, islice
a, b, c = islice(chain(your_iterable, repeat(None)), 3)

虽然,如果我不想这样解包,那么我会考虑使用 adict但这会在语义上略有不同:

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"
于 2013-10-22T11:00:41.090 回答
0

即使我不鼓励这样做:

var1, var2, var3 = ll[:3] + [None] * (3-min(3, len(ll)))

基本上,它用None列表填充缺失值。

于 2013-10-22T10:48:07.713 回答
0

试试这个片段

# 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_list与用default_list.

于 2013-10-22T10:52:15.753 回答
0

由于到目前为止我们还没有基于 itertools 的解决方案:

import itertools as it
var1, var2, var3 = list(it.chain(ll, it.repeat(None, 3- len(ll))))[:3]

但这太荒谬了

于 2013-10-22T10:59:41.720 回答