针对数组中的 .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)
集允许进行恒定时间的成员资格测试;针对列表进行测试需要线性时间,因为整个列表最终可能会针对每个此类测试进行扫描。
我有一个 .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)
集允许进行恒定时间的成员资格测试;针对列表进行测试需要线性时间,因为整个列表最终可能会针对每个此类测试进行扫描。