2016-03-31 12 views
0

Bu sorum var: Eğer diziler içeren bir dizi varsa , buyinelemeli onlara (piton) birleştirilmesi Bir dizinin altdizilimlerden üzerinden çalışacak

A = [[1, 2], [3, 6, 8, 1], [2, 4, 7]] 

gibi, diyelim nasıl arasındaki işlemi gerçekleştirmek için bu mümkün İlk iki alt dizi ve sonucu iki eski yerin yerini işgal eden yeni bir alt dizi olarak yazın, böylece bu işlem sadece bir dizi elde edene kadar bu yeni alt dizi ve onun yanında olanı arasında tekrar tekrar hesaplanabilir.

+1

Özyineleme için bir gereklilik var mı? Aksi takdirde, daha verimli, daha basit yaklaşım sadece: “itertools import chain”, “A = list (chain (* A))'. Ara listeden tonlarca ('dizi' Python'da tamamen farklı ve özel bir amaç, 'listenin 'listesinin' listesi ') kaçınıyor ve herhangi bir' azaltma 'yaklaşımından önemli ölçüde daha hızlı çalışmalı. . Çifte iç içe geçmiş bir şeyi (tek bir iç 'liste' ile) korumanız gerekiyorsa, yalnızca parantez içine sarın:' A = [liste (zincir (* A))] ' – ShadowRanger

+0

Bazı işlevler için beklenen bir çıktı olabilir misiniz? –

cevap

1

Bir reduce işlemini açıklıyorsunuz: iki öğe al, onlara işlem yap, sonra sonucu al ve aynı işlemi bir sonraki öğeyle uygula, vb. Neyse ki, reduce piton yerleşik bir olduğunu bunun için fonksiyonel programlamada böyle temel bir kavramdır: Bu sonuçla ilk iki alt diziler yerine geçmez

def unique_append(left, right): 
    return left + [elem for elem in right if elem not in left] 
    # Example only! Don't do this with lists, use sets! 

arr = [[1, 2], [3, 6, 8, 1], [2, 4, 7]] 
print reduce(unique_append, arr) 
# [1, 2, 3, 6, 8, 4, 7] 

, ancak bunun yerine tüm ara sonuç taşır Son alt diziye kadar olan yolu ve ardından son sonucu döndürür. Ayrıca burada gerekli olmayan özyinelemeyi de içermez.

sen yerinde orijinal dizi değişen ısrar ederseniz, (çeşitli nedenlerle verimsiz ve yavaş olacaktır) bunu yapabilirsiniz:

# Slow, inefficient example 
while len(arr) > 1: 
    arr[:2] = some_operation(arr[0], arr[1]) 
0

Recurse işlemi gerçekleştirirken sizin listlist ait 's tarihinde İlk iki öğede ve yalnızca list solunda olduğunda dönen.

add = lambda l1, l2: sum(l1 + l2) 


def func(lst): 
    if len(lst) == 1: 
     return lst 
    lst = [[add(lst[0], lst[1])]] + lst[2:] 
    return func(lst) 

if __name__ == "__main__": 
    lst = [[1, 2], [3, 4, 5], [6, 7, 8, 9]] 
    print(func(lst)) 

Bu yazdırır:

[[45]] 

her görüşmesinde func ilk iki liste öğeleri (burada iki toplanmasıdır) sizin "operasyon" uygulanmış olması. Daha sonra sonuç, son ikisini kırparak başka bir listeye konur ve bu, geriye kalan sadece bir list olana kadar tekrarlayan bir şekilde tekrar tekrar çağrılır. Diğerleri de belirttiği gibi, bunu yapmanın daha karmaşık ve daha az etkili bir yolu olduğunu belirtmiştir. Yanıtımı temel almak için küçük bir örnek oluşturmaya başladığımda kendimi reduce ve itertools'a ulaştığımı buldum, ancak tam kullanım durumunuzu ve durumunuzu daha ayrıntılı bir şekilde anlatmaksızın bunu sorduğunuzu gösterdim.