Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 使用列表理解解包元组失败,但可以使用for循环 总结_Python_Python 3.x_Tuples_Iterable Unpacking - Fatal编程技术网

Python 使用列表理解解包元组失败,但可以使用for循环 总结

Python 使用列表理解解包元组失败,但可以使用for循环 总结,python,python-3.x,tuples,iterable-unpacking,Python,Python 3.x,Tuples,Iterable Unpacking,我使用了一个半复杂的正则表达式从网站检索数据。我遇到的问题是,我必须对匹配的数据集进行一些后处理 我已经把数据处理到了我想要的95%以上,但是,我得到了这个简单的错误信息,我无法解释;真奇怪 我可以绕过它,但这不是重点我正在试图找出这是否是一个bug,或者是我在打开元组时基本上忽略了的东西 背景信息 我必须克服的一件事是,每一场“真正的比赛”我就有4场比赛。这意味着我的1个项目的数据分布在4个匹配项上 以简单的图形形式(稍微简单化): 我可以得到所有的数据,但我想压缩它,就像这样 index |

我使用了一个半复杂的正则表达式从网站检索数据。我遇到的问题是,我必须对匹配的数据集进行一些后处理

我已经把数据处理到了我想要的95%以上,但是,我得到了这个简单的错误信息,我无法解释;真奇怪

我可以绕过它,但这不是重点我正在试图找出这是否是一个bug,或者是我在打开元组时基本上忽略了的东西

背景信息 我必须克服的一件事是,每一场“真正的比赛”我就有4场比赛。这意味着我的1个项目的数据分布在4个匹配项上

以简单的图形形式(稍微简单化):

我可以得到所有的数据,但我想压缩它,就像这样

index |  a    b    c    d    e    f    g    h    i    j 
--------------------------------------------------------
   1: | (█), (█), (█), (█), (█), (█), (█), (█), (█), (█)
   2: | (▒), (▒), (▒), (▒), (▒), (▒), (▒), (▒), (▒), (▒)

   3: | ...
        ...
 154: | ...
代码 作品 记下变量
abcd
e
f
ghij
,以及如何在底部的
for循环中解包

匹配=[(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”https://dl.google.com/dl/android/studio/ide-zips/3.6.0.13/android-studio-ide-192.5916306-linux.tar.gz', '3.6.0', '13', '192'), (“安卓工作室3.5.1”、“3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1安卓工作室3.5https://dl.google.com/dl/android/studio/ide-zips/3.5.1.0/android-studio-ide-191.5900203-linux.tar.gz', '3.5.1', '0', '191'), (“安卓工作室3.6金丝雀12”、“3.6”、“金丝雀”、“12”、“2019年9月18日”、“2019年9月18日”、“安卓工作室3.6金丝雀12”、“3.6”、“金丝雀”和https://dl.google.com/dl/android/studio/ide-zips/3.6.0.12/android-studio-ide-192.5871855-linux.tar.gz', '3.6.0', '12', '192')]
f=[
F
对于索引,(,,,,,,,f,*)
在枚举中(匹配项)
如果索引%4==0
]
abcd=[
(a、b、c、d)
对于索引,(a,b,c,d,*41;
在枚举中(匹配项)
如果索引%4==1
]
e=[
E
对于索引,(,,,,,e,*)
在枚举中(匹配项)
如果索引%4==2
]
ghij=[
(g、h、i、j)
对于索引,(*g,g,h,i,j)
在枚举中(匹配项)
如果索引%4==3
]
abcdefghij=zip(abcd,e,f,ghij)
对于abcdefghij中的(a,b,c,d),e,f,(g,h,i,j):
打印(“a”、“a”、“nb”、“b”、“nc”、“c”、“nd”、“d”、“ne”、“e”、“nf”、“f”、“ng”、“g”、“nh”、“h”、“ni”、“i”、“nj”、“j”、“n”和“-*100”)
#
失败 请注意,我正试图立即用变量
a
b
c
d
e
f
g
h
I
,和
j
来解压相同的元组

匹配=[(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”https://dl.google.com/dl/android/studio/ide-zips/3.6.0.13/android-studio-ide-192.5916306-linux.tar.gz', '3.6.0', '13', '192'), (“安卓工作室3.5.1”、“3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1”、“安卓工作室3.5.1”、“安卓工作室3.5.1”、“安卓工作室3.1安卓工作室3.5https://dl.google.com/dl/android/studio/ide-zips/3.5.1.0/android-studio-ide-191.5900203-linux.tar.gz', '3.5.1', '0', '191'), (“安卓工作室3.6金丝雀12”、“3.6”、“金丝雀”、“12”、“2019年9月18日”、“2019年9月18日”、“安卓工作室3.6金丝雀12”、“3.6”、“金丝雀”和https://dl.google.com/dl/android/studio/ide-zips/3.6.0.12/android-studio-ide-192.5871855-linux.tar.gz', '3.6.0', '12', '192')]
f=[
F
如果f==“稳定”或“预览”
对于索引,(,,,,,,,f,*)
在枚举中(匹配项)
如果索引%4==0
]
a、 b,c,d=[
(a、b、c、d)
对于索引,(a,b,c,d,*41;
在枚举中(匹配项)
如果索引%4==1
]
e=[
E
对于索引,(,,,,,e,*)
在枚举中(匹配项)
如果索引%4==2
]
g、 h,i,j=[
(g、h、i、j)
对于索引,(*g,g,h,i,j)
在枚举中(匹配项)
如果索引%4==3]
abcdefghij=zip(a,b,c,d,e,f,g,h,i,j)
对于abcdefghij中的a、b、c、d、e、f、g、h、i、j:
打印(“a”、“a”、“nb”、“b”、“nc”、“c”、“nd”、“d”、“ne”、“e”、“nf”、“f”、“ng”、“g”、“nh”、“h”、“ni”、“i”、“nj”、“j”、“n”和“-*100”)
#
使用此代码,我得到以下错误消息

期望 我本以为这两种方法的逻辑完全相同,最终结果应该完全相同

它们不是!为什么?

您的列表
[(a,b,c,d)对于索引,如果索引%4==1,则枚举(匹配)中的(a,b,c,d,*)]
没有额外的4个元素,这意味着仅使用四个变量来解包将失败

@保尔,这辆装甲车似乎能用。我必须确认所有的东西都排好了。但我为什么需要它呢

假设
q
是一个iterable,对于它(?)你的理解会产生一个包含26个元组的列表,每个元组有4个项目

z = [(a,b,c,d) for i, (a,b,c,d,*e) in enumerate(q)]


In [6]: len(z)
Out[6]: 26

In [7]: len(z[0])
Out[7]: 4

In [17]: z[:3]
Out[17]: [('a', 'a', 'a', 'a'), ('b', 'b', 'b', 'b'), ('c', 'c', 'c', 'c')]
当您试图解包时,您试图将26个项目塞进四个名称/变量中

In [8]: a,b,c,d = z
Traceback (most recent call last):

  File "<ipython-input-8-64277b78f273>", line 1, in <module>
    a,b,c,d = z

ValueError: too many values to unpack (expected 4)

测试材料

import string
a = string.ascii_lowercase
b = string.ascii_lowercase
c = string.ascii_lowercase
d = string.ascii_lowercase
e = string.ascii_lowercase
f = string.ascii_lowercase
q = zip (a,b,c,d,e,f)
解决方案 当列表理解创建了一个元组列表,并且您想要解压缩这些元组时,您需要使用
zip(*…)

x,y,z=zip(*列表)
#更清楚地说
x、 y,z=zip(*[(i,j,k)表示元组列表中的(i,j,k)])
#对于我的代码,必须使用此代码进行此更改
a、 b,c,d=zip(*[
(a、b、c、d)
对于索引,(a,b,c,d,*41;
在枚举中(匹配项)
如果索引%4==1
])
...
#这个密码呢
g、 h,i,j=zip(*[
(g)
In [8]: a,b,c,d = z
Traceback (most recent call last):

  File "<ipython-input-8-64277b78f273>", line 1, in <module>
    a,b,c,d = z

ValueError: too many values to unpack (expected 4)
In [9]: 

In [9]: a,b,c,d = zip(*z)    # z is the result of the list comprehension shown above

In [11]: len(a),len(b),len(c),len(d)
Out[11]: (26, 26, 26, 26)
import string
a = string.ascii_lowercase
b = string.ascii_lowercase
c = string.ascii_lowercase
d = string.ascii_lowercase
e = string.ascii_lowercase
f = string.ascii_lowercase
q = zip (a,b,c,d,e,f)