针对数组中的 .NET 数组的嵌套列表理解

Nested list comprehension against .NET Arrays within Arrays

我有一个 .NET 结构,其中包含包含数组的数组。如果可能,我想在 IronPython 中使用列表推导式从特定数组中创建项目成员列表。

这是我现在正在做的事情:

tag_results = [item_result for item_result in results.ItemResults if item_result.ItemId == tag_id][0]
tag_vqts = [vqt for vqt in tag_results.VQTs]
tag_timestamps = [vqt.TimeStamp for vqt in tag_vqts]

因此,从符合我条件的结果数组中获取单项结果,然后从这些项结果中获取 vqts 数组,然后获取 vqts 数组中每个 VQT 的所有时间戳成员。

想在单个语句中执行此操作是不是太过分了?稍后,时间戳将以这种方式使用:

vqts_to_write = [vqt for vqt in resampled_vqts if not vqt.TimeStamp in tag_timestamps]

我不确定生成器是否合适,因为我并没有真正遍历它们,我只想要一个包含此 item/tag 所有项目结果的所有时间戳的列表,以便我可以测试列表中的成员资格。

我必须针对脚本中的不同上下文多次执行此操作,所以我只是想知道我是否以高效且 pythonic 的方式执行此操作。我正在将其重构为一种方法,这让我开始考虑让它变得更简单。

仅供参考,这是 IronPython 2.6,嵌入在不允许使用 numpy、pandas 等的固定环境中。假设我需要一个仅 python 2.6 的解决方案是安全的.

我的主要问题是:

如果可能的话,将其折叠成一行是否会混淆代码?

如果折叠是合适的,一种方法会不会矫枉过正?

两个!我的两个主要问题是:

如果可能的话,将其折叠成一行是否会混淆代码?

如果折叠是合适的,一种方法会不会矫枉过正?

生成器是否适合测试列表中的成员资格?

三个!我的三个问题是......在我的问题中有各种各样的问题......我会再次进来......

(它是 python...)

tag_results = [...][0] 构建一个 全新列表 只是为了获得一个项目。这就是生成器表达式上的 next() 的用途:

next(item_result for item_result in results.ItemResults if item_result.ItemId == tag_id)

它只会迭代到足以获得第一个项目。

可以 将其内联,但为了便于阅读,我会将其保留为单独的表达式。

余数很容易放入一个表达式中:

tag_results = next(item_result for item_result in results.ItemResults 
                   if item_result.ItemId == tag_id)
tag_timestamps = [vqt.TimeStamp for vqt in tag_results.VQTs]

如果您只需要进行成员资格测试,我会将其设置为 :

tag_timestamps = set(vqt.TimeStamp for vqt in tag_results.VQTs)

集允许进行恒定时间的成员资格测试;针对列表进行测试需要线性时间,因为整个列表最终可能会针对每个此类测试进行扫描。