标签: iterable-unpacking

Django - 如何在模板'for'循环中进行元组解包

在我的views.py中,我正在构建一个包含两元组的列表,其中元组中的第二项是另一个列表,如下所示:

[ Product_Type_1, [ product_1, product_2 ],
  Product_Type_2, [ product_3, product_4 ]]
Run Code Online (Sandbox Code Playgroud)

在普通的旧Python中,我可以像这样迭代列表:

for product_type, products in list:
    print product_type
    for product in products:
        print product
Run Code Online (Sandbox Code Playgroud)

我似乎无法在我的Django模板中做同样的事情:

{% for product_type, products in product_list %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我从Django得到这个错误:

渲染时捕获异常:zip参数#2必须支持迭代

当然,模板中有一些HTML标记,而不是print语句.Django模板语言不支持元组解包吗?或者我是以错误的方式来做这件事的?我要做的就是显示一个简单的对象层次结构 - 有几种产品类型,每种都有几种产品(在models.py中,Product有Product_type的外键,简单的一对多关系).

显然,我对Django很新,所以任何输入都会受到赞赏.

python django templates tuples iterable-unpacking

56
推荐指数
3
解决办法
6万
查看次数

如何将长度为n的元组解包为m <n个变量

在Python 3中,我可以执行以下操作(另请参阅PEP3132 on Extended Iterable Unpacking):

a, *b = (1, 2, 3)
# a = 1; b = (2, 3)
Run Code Online (Sandbox Code Playgroud)

我能做些什么才能在Python 2.x中实现同样优雅?


我知道我可以使用单元素访问和切片操作,但我想知道是否有更多的pythonic方式.我的代码到目前为止:

a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)
Run Code Online (Sandbox Code Playgroud)

python iterable-unpacking

45
推荐指数
3
解决办法
3万
查看次数

使用Python赋值运算符使用逗号和下划线的含义?

通过Peter Norvig的解决每一个数独拼图文章,我遇到了一些我以前从未见过的Python习语.

我知道函数可以返回一个元组/值列表,在这种情况下,您可以为结果分配多个变量,例如

def f():
    return 1,2

a, b = f()
Run Code Online (Sandbox Code Playgroud)

但是以下各项的含义是什么?

d2, = values[s]  ## values[s] is a string and at this point len(values[s]) is 1
Run Code Online (Sandbox Code Playgroud)

如果len(values[s]) == 1,那么这个陈述与此有何不同d2 = values[s]

关于在作业中使用下划线的另一个问题:

_,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1)
Run Code Online (Sandbox Code Playgroud)

下划线是否具有基本上丢弃列表中返回的第一个值的效果?

python syntax iterable-unpacking

41
推荐指数
4
解决办法
4万
查看次数

在R中解压缩省略号的参数列表

...对一些函数中使用省略号()感到困惑,即如何将包含参数的对象作为单个参数传递.

在Python中,它被称为"解包参数列表",例如

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

例如,在R中你有一个file.path(...)使用省略号的函数.我想有这样的行为:

> args <- c('baz', 'foob') 
> file.path('/foo/bar/', args)
[1] 'foo/bar/baz/foob'
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

[1] 'foo/bar/baz' 'foo/bar/foob'
Run Code Online (Sandbox Code Playgroud)

其中的元素args不是"解包"并同时进行评估.是否有R等价于蟒蛇*arg

r list ellipsis iterable-unpacking

40
推荐指数
3
解决办法
1万
查看次数

忽略python元组的一部分

如果我有一个像这样的元组,(1,2,3,4)并且我想将1和3分配给变量a和b,我可以明显地说

myTuple = (1,2,3)
a = my_tuple[0]
b = myTuple[2]
Run Code Online (Sandbox Code Playgroud)

或类似的东西

(a,_,b,_) = myTuple
Run Code Online (Sandbox Code Playgroud)

有没有办法可以解压缩值,但忽略它们中的一个或多个?

python tuples iterable-unpacking

40
推荐指数
4
解决办法
2万
查看次数

Python版本为2.7版解压缩

正如这里提到的,你可以使用star解压缩未知数量的变量(比如在函数中),但只能在python 3中:

>>> a, *b = (1, 2, 3)
>>> b
[2, 3]
>>> a, *b = (1,)
>>> b
[]
Run Code Online (Sandbox Code Playgroud)

在python 2.7中,我能想到的最好的是(并不可怕,但很烦人):

c = (1, 2, 3)
a, b = c[0], c[1:] if len(c) > 1 else []
Run Code Online (Sandbox Code Playgroud)

有没有办法从__future__像分区导入它,或者我需要自己的函数在python 2.7中进行未知长度的解包?

python iterable-unpacking

34
推荐指数
1
解决办法
2万
查看次数

如何在变量中提取字典单键值对

我在字典中只有一个键值对.我想将键分配给一个变量,将它的值分配给另一个变量.我尝试过以下方式,但我得到的错误相同.

>>> d = {"a": 1}

>>> d.items()
[('a', 1)]

>>> (k, v) = d.items()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

>>> (k, v) = list(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
Run Code Online (Sandbox Code Playgroud)

我知道我们可以逐个提取键和值,或者通过for循环和iteritems(),但是不是一种简单的方法,我们可以在单个语句中分配它们吗?

python dictionary python-2.7 iterable-unpacking

34
推荐指数
3
解决办法
5万
查看次数

Python:解压缩内部嵌套元组/列表,同时仍获取其索引号

我熟悉使用enumerate():

>>> seq_flat = ('A', 'B', 'C')
>>> for num, entry in enumerate(seq_flat):
        print num, entry
0 A
1 B
2 C
Run Code Online (Sandbox Code Playgroud)

我希望能够为嵌套列表做同样的事情:

>>> seq_nested = (('A', 'Apple'), ('B', 'Boat'), ('C', 'Cat'))
Run Code Online (Sandbox Code Playgroud)

我可以打开包装:

>>> for letter, word in seq_nested:
        print letter, word
A Apple
B Boat
C Cat
Run Code Online (Sandbox Code Playgroud)

我应该如何解压缩以获得以下信息?

0 A Apple
1 B Boat
2 C Cat
Run Code Online (Sandbox Code Playgroud)

我知道的唯一方法是使用计数器/增量器,据我所知,这是非Pythonic.有更优雅的方式吗?

python tuples list enumerate iterable-unpacking

33
推荐指数
1
解决办法
7975
查看次数

是否可以在Python中解压缩元组而不创建不需要的变量?

有没有办法编写以下函数,以便我的IDE不会抱怨该是未使用的变量?

def get_selected_index(self):
    (path, column) = self._tree_view.get_cursor()
    return path[0]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不关心元组中的第二项,只是想在解压缩时丢弃对它的引用.

python tuples iterable-unpacking

33
推荐指数
1
解决办法
1万
查看次数

为什么分配给空列表而不是空元组是有效的?

这是在最近的PyCon演讲中提出的.

该声明

[] = []
Run Code Online (Sandbox Code Playgroud)

没有任何意义,但它也没有抛出异常.我觉得这一定是因为拆包规则.您也可以使用列表进行元组拆包,例如,

[a, b] = [1, 2]
Run Code Online (Sandbox Code Playgroud)

做你所期望的.作为逻辑结果,当解包的元素数为0时,这也应该有效,这可以解释为什么分配给空列表是有效的.当您尝试将非空列表分配给空列表时会发生什么,这进一步支持了这一理论:

>>> [] = [1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

如果对于元组也是如此,我会对这个解释感到满意.如果我们可以解压缩到包含0个元素的列表,我们也应该能够解包为具有0个元素的元组,不是吗?然而:

>>> () = ()
  File "<stdin>", line 1
SyntaxError: can't assign to ()
Run Code Online (Sandbox Code Playgroud)

似乎解包规则不适用于元组,因为它们用于列表.我想不出对这种不一致的任何解释.这种行为有原因吗?

python iterable-unpacking

30
推荐指数
2
解决办法
1324
查看次数