2012-11-28 12 views
5

Bazen birden çok dizi katmanında yuvalanabilen verilere sahip olduğum bir durum var.Çoklu dizilerde iç içe geçmiş bir dizi döndürmenin en kolay yolu

veri gibi iç içe olabilir Bazı kere:

[ [ 'green', 'blue', 'red' ] ] 

Diğer zamanlarda

[[[ ['green', 'blue', 'red' ] ]]] 

bunu dizi ayıklamak ve dönmek istiyorum, ya bu yapmanın en pythonic yolu olurdu?

+1

Ebeveyn listelerinde başka öğeler var mı? ya da aşırı yuvalamayı soymak mı istiyorsunuz? –

+0

Bkz. Http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python –

+1

"Yuvalama" işlemini kaldırmak kolaydır - ama daha çok bakarım ilk etapta olmaması, yani, eğer öngörülemeyen sonuçlar varsa - o zaman adresleme ihtiyacı olan bir yerde bir kusur var ... –

cevap

3

Numpy olarak her zaman en iyi arkadaşıdır: squeeze() bütün boyutlarını kaldırın

>>> import numpy as np 
>>> a = [[[ ['green', 'blue', 'red' ] ]]] 
>>> print np.squeeze(a) 
['green' 'blue' 'red'] 

numpy fonksiyonu olduğunu dizininizde 1 tane var.

+1

En iyi arkadaşınla her zamanki gibi hemfikir değilsin - ama +1 –

+0

:) neden? Numpy geçmişte seni hiç hayal kırıklığına uğrattı mı? –

3
def get_nested_list(a): 
    if len(a) == 1 and isinstance(a[0], list): 
     return get_nested_list(a[0]) 
    return a 

Örnekler:

>>> get_nested_list([[[ ['green', 'blue', 'red' ] ]]]) 
['green', 'blue', 'red'] 
>>> get_nested_list([[[[1, 2],[3]]]]) 
[[1, 2], [3]] 
+0

Bu, yalnızca tek bir öğenin yuvalanmış olması durumunda kullanışlıdır. – asheeshr

+0

@AshRj: Şimdi çok öğeli listeleri bazı aklı ile işler. –

+0

İlk testin boş listeleri kontrol etmek olduğunu mu varsayıyorum? Ama zaten boş listeleri idare edecek bir kontrol len (a) == 1 var .. – asheeshr

0

özyinelemeli çözüm:

def strip(a): 
    if len(a)==1: 
     if isinstance(a[0], list): 
      a=a[0] 
      return strip(a) 
     else: 
      return a 
    return a 
+0

[[1,2], [3,4]]? – asheeshr

+0

@AshRj, bu durumda beklenen çıktı ne olurdu? –

+0

Programın durumuna bağlı olarak, ilk listeyi veya ikinci listeyi iade etmek isteyebilirsiniz. – asheeshr

İlgili konular