2015-04-21 114 views
0

下面討論了許多小段到一個連續行的減速聚合,我想知道是否有一個Python固有的基本功能或方法,它可以改善列表的密集列表的擠壓列表。{在Python中}優化子列表子列表的連接?

輸入列表目(下面)...

[[[(439126.42276230257, 4366763.865840635), (439127.8329119178, 
4366764.384558427)], [(439064.92276230257, 4366799.37288219), 
(439064.21935966297, 4366800.934456211)], [(439064.92276230257, 
4366728.35879908), (439064.1251401864, 4366727.765222029)], 
[(439127.8329119178, 4366764.384558427), (439129.18782485375, 
4366764.924527419)], [(439064.21935966297, 4366800.934456211), 
(439063.5045345232, 4366802.470752875)], [(439064.1251401864, 
4366727.765222029), (439063.3147971064, 4366727.180521704)], 
[(439129.18782485375, 4366764.924527419), (439130.4896647748, 
4366765.486618243)], [(439063.5045345232, 4366802.470752875), 
(439062.7781013942, 4366803.982181352)], [(439063.3147971064, 
4366727.180521704), (439062.4915301808, 4366726.604565358)]], 
[[(439212.46675091964, 4366676.785177457), (439212.6113935248, 
4366676.973096527), (439212.8949954961, 4366677.397581227)], 
[(439150.96675091964, 4366712.292219012), (439151.29482351645, 
4366712.568996211)], [(439150.96675091964, 4366641.278135902), 
(439151.01221407554, 4366641.631532382)], [(439212.8949954961, 
4366677.397581227), (439213.32280838164, 4366678.03858695)], 
[(439151.29482351645, 4366712.568996211), (439151.623562939, 
4366712.845224134)], [(439151.01221407554, 4366641.631532382), 
(439151.05788385356, 4366641.983286338)], [(439213.32280838164, 
4366678.03858695), (439213.75032742484, 4366678.679960683)], 
[(439151.623562939, 4366712.845224134), (439151.9529705426, 
4366713.120903871)], [(439151.05788385356, 4366641.983286338), 
(439151.10376119264, 4366642.333405403)]], [[(439700.7404694573, 
4365997.763339574), (439700.55680522305, 4365999.341595855)], 
[(439639.2404694573, 4366033.270381129), (439638.8165085041, 
4366034.984056383)], [(439639.2404694573, 4365962.25629802), 
(439638.80424761766, 4365963.619678194)], [(439700.55680522305, 
4365999.341595855), (439700.37461392384, 4366000.93244889)], 
[(439638.8165085041, 4366034.984056383), (439638.7728443413, 
4366035.160771348), (439638.49832678796, 4366036.693936106)], 
[(439638.80424761766, 4365963.619678194), (439638.3677443037, 
4365964.982072221)], [(439700.37461392384, 4366000.93244889), 
(439700.19388374704, 4366002.535999221)], [(439638.49832678796, 
4366036.693936106), (439638.1922230592, 4366038.402710422)], 
[(439638.3677443037, 4365964.982072221), (439637.9309593339, 
4365966.343480815)]]] 

...經由該功能(慢)過程合併;其中timeBlock是匹配指數迭代器子列表的每個子列表...

for groupIdx, group in enumerate(cleanPathsGrouped): 
    pathsInGroup = int(groupMemberCounts[groupIdx]) 
    for pathIdx, path in enumerate(group): 
     for time in range(1,timeBlock+1): 
      if pathIdx+1>pathsInGroup:continue 
      else: 
       if time==1: 
        newPathGroups[groupIdx][pathIdx]+=path 
       elif time>1: 
        newPathGroups[groupIdx][pathIdx]+=group[pathIdx+(pathsInGroup*(time-1))] 

導致...

[[[(439126.42276230257, 4366763.865840635), (439127.8329119178, 
4366764.384558427), (439127.8329119178, 4366764.384558427), 
(439129.18782485375, 4366764.924527419), (439129.18782485375, 
4366764.924527419), (439130.4896647748, 4366765.486618243)], 
[(439064.92276230257, 4366799.37288219), (439064.21935966297, 
4366800.934456211), (439064.21935966297, 4366800.934456211), 
(439063.5045345232, 4366802.470752875), (439063.5045345232, 
4366802.470752875), (439062.7781013942, 4366803.982181352)], 
[(439064.92276230257, 4366728.35879908), (439064.1251401864, 
4366727.765222029), (439064.1251401864, 4366727.765222029), 
(439063.3147971064, 4366727.180521704), (439063.3147971064, 
4366727.180521704), (439062.4915301808, 4366726.604565358)]], 
[[(439212.46675091964, 4366676.785177457), (439212.6113935248, 
4366676.973096527), (439212.8949954961, 4366677.397581227), 
(439212.8949954961, 4366677.397581227), (439213.32280838164, 
4366678.03858695), (439213.32280838164, 4366678.03858695), 
(439213.75032742484, 4366678.679960683)], [(439150.96675091964, 
4366712.292219012), (439151.29482351645, 4366712.568996211), 
(439151.29482351645, 4366712.568996211), (439151.623562939, 
4366712.845224134), (439151.623562939, 4366712.845224134), 
(439151.9529705426, 4366713.120903871)], [(439150.96675091964, 
4366641.278135902), (439151.01221407554, 4366641.631532382), 
(439151.01221407554, 4366641.631532382), (439151.05788385356, 
4366641.983286338), (439151.05788385356, 4366641.983286338), 
(439151.10376119264, 4366642.333405403)]], [[(439700.7404694573, 
4365997.763339574), (439700.55680522305, 4365999.341595855), 
(439700.55680522305, 4365999.341595855), (439700.37461392384, 
4366000.93244889), (439700.37461392384, 4366000.93244889), 
(439700.19388374704, 4366002.535999221)], [(439639.2404694573, 
4366033.270381129), (439638.8165085041, 4366034.984056383), 
(439638.8165085041, 4366034.984056383), (439638.7728443413, 
4366035.160771348), (439638.49832678796, 4366036.693936106), 
(439638.49832678796, 4366036.693936106), (439638.1922230592, 
4366038.402710422)], [(439639.2404694573, 4365962.25629802), 
(439638.80424761766, 4365963.619678194), (439638.80424761766, 
4365963.619678194), (439638.3677443037, 4365964.982072221), 
(439638.3677443037, 4365964.982072221), (439637.9309593339, 
4365966.343480815)]]] 

也許我俯瞰這將加快這一進程的替代?

KUDOS @Scott獵人提供線索導致了以下解決方案:幅度減少

for groupIdx, group in enumerate(cleanPathsGrouped): 
     pathsInGroup = int(groupMemberCounts[groupIdx]) 
     for pathIdx, path in enumerate(group): 
      if pathIdx+1>pathsInGroup:continue 
      newPathGroups[groupIdx][pathIdx]+=path 
      for time in range(2,timeBlock+1): 
       newPathGroups[groupIdx][pathIdx]+=group[pathIdx+(pathsInGroup*(time-1))] 

兩個訂單的時間來連接是結果!

回答

1

您應該在之前處理pathIdx+1>pathsInGrouptime循環;如果這是真的,則根本不需要執行time循環(因爲,據我所知,因爲在該循環中pathIdxpathsInGroup都沒有變化)。

您也可以通過執行其中time==1循環之前,然後使用range(2,timeBlock+1)的情況下消除time循環剩餘if

+0

傑出!你的提示產生了將近2個數量級的時間縮短列表!帽子@Scott獵人!更新原始文章中使用的解決方案 - 現在就認證您的答案。 – Katalpa