【问题标题】:django zip unequal listsdjango zip 不等长列表
【发布时间】:2018-07-23 11:59:36
【问题描述】:

我有 2 个查询,您可以找到如下打印结果。

<QuerySet [{'swtype': 1}, {'swtype': 2}]>
 <QuerySet ['201;203;205', '207;208']>

我在 stackoverflow 上查看了一些命令,用于按照以下方式配对这些列表。

pair = itertools.zip_longest(swtype, p_list)

但是输出不是我想要的。就像

1:201
2:203
none:205
none:207
none:208

我追求的是拥有:

1:201
none:203
none:205
2:207
none:208

是否可以通过压缩或创建 2 个单独的循环。 如果我创建 2 个单独的循环,我就会遇到其他问题。

【问题讨论】:

  • 你会立即配对吗?我的想法是您对第二个查询集进行一些处理以生成 p_list...
  • 不是马上,我从 .objects.filter 结果中得到那些,然后处理列表而不是压缩 :) 你在想什么?
  • 但是p_list 的元素是201203 等。而在查询集中,它看起来像单个字符串''201;203;205'?

标签: python django list zip


【解决方案1】:

我认为您对第二个查询集进行了一些处理,用分号 (;) 将其拆分为子字符串。这样做的问题是结构丢失了,因此你zip 就好像这些总是独立的元素一样。但是,您可以保留结构并使用:

from itertools import chain, zip_longest

qs1 = [{'swtype': 1}, {'swtype': 2}]  # first queryset
qs2 = ['201;203;205', '207;208']      # second queryset

result = chain.from_iterable(
    zip_longest((qi1['swtype'],), qi2.split(';')) for qi1, qi2 in zip(qs1, qs2)
)

因此,我们在这里迭代两个 查询集 qi1qi2,然后我们在 qi1[swtype] 上执行 zip_longest(包装成一个 单元组 因为我们需要一个可迭代对象,所以我们将qi2 的字符串拆分为带有qi2.split(';') 的子字符串)。然后我们将chain "subzips" 放在一起。

但是请注意,如果这两个查询集源自一个相似的查询,我建议您将这两个查询合并为一个。这更安全,因为它保证订单匹配,而且通常(有一些例外),它也更有效。

【讨论】:

  • 您可以使用qs1 = [{'swtype': 1}, {'swtype': 2}]qs2 = ['201;203;205', '207;208'] 添加到您的答案示例
  • 非常感谢您的帮助。我实际上无法进行单个查询,因为我正在根据第一个查询输入获取第二个查询的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2018-08-14
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多