Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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_List Comprehension - Fatal编程技术网

Python多列表理解不起作用,如何正确执行?

Python多列表理解不起作用,如何正确执行?,python,list-comprehension,Python,List Comprehension,我试试这个: tmp=“一;1\n两;2\n三;3” 选项=[(x.strip(),y.strip()) 供tmp.split中选择(“\n”) 对于x,y的选择。拆分(“;”) 如果选择。查找(“;”)!=-1] 我收到的错误消息是:{ValueError}要解压缩的值太多(预期为2)。我不明白。如果我将理解修改为: >>选项=[x 供tmp.split中选择(“\n”) 用于选择中的x。拆分(“;”)] >>>选择 [‘一’、‘一’、‘二’、‘二’、‘三’、‘三’] 我发现分割操作是正确

我试试这个:

tmp=“一;1\n两;2\n三;3”
选项=[(x.strip(),y.strip())
供tmp.split中选择(“\n”)
对于x,y的选择。拆分(“;”)
如果选择。查找(“;”)!=-1]
我收到的错误消息是:
{ValueError}要解压缩的值太多(预期为2)
。我不明白。如果我将理解修改为:

>>选项=[x
供tmp.split中选择(“\n”)
用于选择中的x。拆分(“;”)]
>>>选择
[‘一’、‘一’、‘二’、‘二’、‘三’、‘三’]
我发现分割操作是正确的,只是没有分配

基本上我想要这个:

>>选项=[使用tmp变量的魔法列表comp]
>>>选择
[(“一”、“一”)、(“二”、“二”)、……等]

有人知道怎么做吗

您可以执行以下操作:

choices = [tuple(map(str.strip, choice.split(";"))) for choice in tmp.split("\n") if choice.find(";")]
print(choices)
输出

[('one', '1'), ('two', '2'), ('three', '3')]

您可以执行以下操作:

choices = [tuple(map(str.strip, choice.split(";"))) for choice in tmp.split("\n") if choice.find(";")]
print(choices)
输出

[('one', '1'), ('two', '2'), ('three', '3')]

代码的问题是,您的代码在字符串上迭代,但试图将每个字符串解包为两个元素的元组

让我们考虑一下嵌套循环的第一次迭代:

for choice in tmp.split("\n")
结果为['1;1']

choice.split(“;”)

结果为['1']

因此,选择x,y的行
。拆分(;”)
在第一次迭代中将被评估为
x,y='one'
,并将失败,出现
ValueError

那么:

choices = []

for choice in tmp.split("\n"):
    choices.append(tuple([val.strip() for val in choice.split(";")]))

print(choices)

代码的问题是,您的代码在字符串上迭代,但试图将每个字符串解包为两个元素的元组

让我们考虑一下嵌套循环的第一次迭代:

for choice in tmp.split("\n")
结果为['1;1']

choice.split(“;”)

结果为['1']

因此,选择x,y的行
。拆分(;”)
在第一次迭代中将被评估为
x,y='one'
,并将失败,出现
ValueError

那么:

choices = []

for choice in tmp.split("\n"):
    choices.append(tuple([val.strip() for val in choice.split(";")]))

print(choices)

另一个答案给出了另一个解决方案,但我要提到的问题是

for x,y in choice.split(";")
迭代由
choice.split(;”)
返回的结果

请注意,两者之间存在差异

for t in choice.split(";")  # t is each element of the list returned by split

如果您稍微修改一下理解,以提供一些调试信息,则会更清楚:

>>> choices = [(t, len(t))
               for choice in tmp.split("\n") 
               for t in choice.split(";")]

>>> choices
[('one ', 4), (' 1 ', 3), (' two ', 5), (' 2 ', 3), (' three ', 7), (' 3', 2)]

另一个解决办法是利用:

未经测试,因为这只适用于3.8,我没有3.8解释器。不过,这应该行得通


但不要这样做。我之所以展示它,是因为我认为这就是你在为x,y选择中编写
时的想法。split(;”)
另一个答案给出了另一种解决方案,但我要提到的问题是

for x,y in choice.split(";")
迭代由
choice.split(;”)
返回的结果

请注意,两者之间存在差异

for t in choice.split(";")  # t is each element of the list returned by split

如果您稍微修改一下理解,以提供一些调试信息,则会更清楚:

>>> choices = [(t, len(t))
               for choice in tmp.split("\n") 
               for t in choice.split(";")]

>>> choices
[('one ', 4), (' 1 ', 3), (' two ', 5), (' 2 ', 3), (' three ', 7), (' 3', 2)]

另一个解决办法是利用:

未经测试,因为这只适用于3.8,我没有3.8解释器。不过,这应该行得通


但不要这样做。我之所以展示它,是因为我认为这是你在为x,y选择写
时脑子里的想法。split(“;”)

请不要这样写代码,别人很难理解,随着时间的推移,你也很难理解。是的,非常感谢,我请提供一个更好的版本或实际答案。这没有帮助,for循环看起来很笨拙。请不要这样编写代码,其他人很难理解,随着时间的推移,你也很难理解。是的,非常感谢,我请提供更好的版本或实际答案。这并没有帮助,for循环看起来很笨拙。这可能正是我想要的——从技术上来说。我明白这在时间上是很难维持的:)。我会考虑另一个丹尼尔的答案最好的每一天的编程,我会标记你的解决方案。这可能正是我所寻找的-技术上。我明白这在时间上是很难维持的:)。我会考虑其他丹尼尔的答案最好的每一天的编程,我会标记你的解决方案。