2016-07-30 45 views
1

我有一個.NET結構,其中有數組。如果可能的話,我想使用IronPython中的列表理解來從特定數組的特定數組中創建列表項的成員列表。對陣列中的.NET數組的嵌套列表理解

這裏是我現在做:

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] 

我不知道,如果一臺發電機將是適當的,因爲我沒有真正通過他們循環,我只是希望所有的時間戳列表所有項目/標籤的結果,以便我可以測試列表中的成員資格。

我必須對腳本中的不同上下文進行多次這樣的操作,所以我只是想知道我是否以高效和pythonic的方式來做這件事。我正在將它重構成一種方法,這讓我想到讓它變得更容易。

僅供參考,這是IronPython 2.6,嵌入在不允許使用numpy,pandas等的固定環境中。假設我需要僅Python 2.6的解決方案是安全的。

我的主要問題是:

會崩潰到這個單行線,如果可能的話,混淆代碼?

如果崩潰是合適的,方法是否會過分?

兩個!我的兩個主要問題是:

如果可能,將代碼混淆成單行代碼?

如果崩潰是合適的,方法是否會過分?

是否適用於測試列表中的成員身份的生成器?

三!我的三個問題......當中我的問題是這樣不同的查詢,......我會再來的......

(這是蟒蛇...)

回答

1

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) 

設置允許一定的時間會員測試;對列表進行測試需要線性時間,因爲整個列表最終可能會針對每個此類測試進行掃描。

+1

優秀的信息!當我遇到需要的東西時,我慢慢地瞭解標準庫,但有時候,除非我偶然瀏覽文檔或記住幾個月前在線視頻中記錄的幾分鐘內,我忘記了事情,直到我把它們在實踐中。這是我需要的信息。我還注意到'immortset'是不變的列表,我的大部分都是。謝謝! – noelhx