Listelerden d├╝z bir liste nas─▒l yap─▒l─▒r?


Al─▒nan cevaba git


Python'daki listelerden basit bir liste yapmak i├žin bir k─▒sayol olup olmad─▒─č─▒n─▒ merak ediyorum.

Bunu bir for d├Âng├╝de yapabilirim, ama belki de haval─▒ bir "tek astar" var? Denedim reduce() ama bir hata al─▒yorum.

kod

 l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
 

Hata mesaj─▒

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
 

2862





2009-06-04




Cevap say─▒s─▒n─▒ say: 30






Bir liste listesi verilen l ,

flat_list = [item for sublist in l for item in sublist]

bunun anlam─▒:

 flat_list = []
for sublist in l:
    for item in sublist:
        flat_list.append(item)
 

┼čimdiye kadar yay─▒nlanan k─▒sayollardan daha h─▒zl─▒. ( l d├╝zle┼čtirilecek liste.)

─░┼čte kar┼č─▒l─▒k gelen fonksiyon:

 flatten = lambda l: [item for sublist in l for item in sublist]
 

Kan─▒t olarak, timeit mod├╝l├╝ standart k├╝t├╝phanede kullanabilirsiniz:

 $ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 1.1 msec per loop
 

A├ž─▒klama: L alt listeleri varken ( + i├žinde kullan─▒m─▒n da dahil oldu─ču) dayal─▒ k─▒sayollar zorunludur - ara sonu├ž listesi uzad─▒k├ža, her ad─▒mda yeni bir ara sonu├ž listesi nesnesi tahsis edilir ve t├╝m ├Â─čeler ├Ânceki orta sonu├žta kopyalanmal─▒d─▒r (son olarak eklenen birka├ž yenisinin yan─▒ s─▒ra). Dolay─▒s─▒yla, basitlik ve ger├žek bir genel kay─▒p olmadan, her birinin I maddesinin L alt listesine sahip oldu─čunuzu s├Âyleyin: ilk I ├Â─čeleri L-1 kez ileri geri kopyalan─▒r, ikinci I ├Â─čeleri L-2 kez vb. toplam kopya say─▒s─▒, 1 i├žin L'den x'e kadar olan x'in toplam─▒n─▒n 1 kat─▒d─▒r, yani . sum O(L**2) I * (L**2)/2

Liste anlama sadece bir kez bir liste olu┼čturur ve her bir ├Â─čeyi (orijinal ikamet yerinden sonu├ž listesine) tam olarak bir kez kopyalar.


4146







Kullanabilirsiniz itertools.chain() :

 >>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain(*list2d))
 

veya, Python> = 2.6'da, itertools.chain.from_iterable() listenin a├ž─▒lmas─▒ gerekmeyen kullan─▒m─▒ kullan─▒n :

 >>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain.from_iterable(list2d))
 

Bu yakla┼č─▒m tart─▒┼čmal─▒ bir ┼čekilde daha okunakl─▒ [item for sublist in l for item in sublist] ve daha h─▒zl─▒ g├Âr├╝n├╝yor.

 [[email protected]]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
10000 loops, best of 3: 24.2 usec per loop
[[email protected]]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 45.2 usec per loop
[[email protected]]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 488 usec per loop
[[email protected]]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 522 usec per loop
[[email protected]]$ python --version
Python 2.7.3
 

1363







Yazardan not : Bu verimsiz. Ama e─členceli, ├ž├╝nk├╝ monoidler harika. ├ťretim Python kodu i├žin uygun de─čil.

 >>> sum(l, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Bu sadece birinci arg├╝manda ge├žen tekrarlanabilir unsurlar─▒ toplar, ikinci arg├╝man─▒ toplam─▒n ba┼člang─▒├ž ÔÇőÔÇőde─čeri olarak kabul eder (e─čer verilmezse 0 kullan─▒l─▒r ve bu durum size bir hata verir).

├ç├╝nk├╝ i├ž i├že ge├žmi┼č listeleri topluyorsunuz, asl─▒nda [1,3]+[2,4] bunun sonucu sum([[1,3],[2,4]],[]) olarak e┼čit [1,3,2,4] .

Yaln─▒zca liste listelerinde ├žal─▒┼čt─▒─č─▒n─▒ unutmay─▒n. Liste listeleri i├žin ba┼čka bir ├ž├Âz├╝me ihtiyac─▒n─▒z olacak.


807







En ├žok ├Ânerilen ├ž├Âz├╝mleri perfplot ile test ettim (bir evcil hayvan projem, asl─▒nda etraf─▒mda bir sarmalay─▒c─▒ timeit ) ve buldum

 functools.reduce(operator.iconcat, a, [])
 

en h─▒zl─▒ ├ž├Âz├╝m olmak. ( operator.iadd e┼čit derecede h─▒zl─▒.)


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin


Grafi─či yeniden olu┼čturma kodu:

 import functools
import itertools
import numpy
import operator
import perfplot


def forfor(a):
    return [item for sublist in a for item in sublist]


def sum_brackets(a):
    return sum(a, [])


def functools_reduce(a):
    return functools.reduce(operator.concat, a)


def functools_reduce_iconcat(a):
    return functools.reduce(operator.iconcat, a, [])


def itertools_chain(a):
    return list(itertools.chain.from_iterable(a))


def numpy_flat(a):
    return list(numpy.array(a).flat)


def numpy_concatenate(a):
    return list(numpy.concatenate(a))


perfplot.show(
    setup=lambda n: [list(range(10))] * n,
    kernels=[
        forfor, sum_brackets, functools_reduce, functools_reduce_iconcat,
        itertools_chain, numpy_flat, numpy_concatenate
        ],
    n_range=[2**k for k in range(16)],
    logx=True,
    logy=True,
    xlabel='num lists'
    )
 

333







 from functools import reduce #python 3

>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(lambda x,y: x+y,l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

extend() Daki ├Ârnekte y├Ântem, modifiye x yerine (faydal─▒ bir de─čeri d├Ânen reduce() bekler).

reduce S├╝r├╝m yapman─▒n daha h─▒zl─▒ bir yolu

 >>> import operator
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(operator.concat, l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

154







─░┼čte say─▒lar , dizeler , i├ž i├že listeler ve kar─▒┼č─▒k kaplar i├žin ge├žerli olan genel bir yakla┼č─▒m .

kod

 #from typing import Iterable 
from collections import Iterable                            # < py38


def flatten(items):
    """Yield items from any nested iterable; see Reference."""
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            for sub_x in flatten(x):
                yield sub_x
        else:
            yield x
 

Notlar :

  • Python 3'te, yield from flatten(x) yerini alabilir for sub_x in flatten(x): yield sub_x
  • Python 3.8 i├žinde, soyut temel s─▒n─▒flar─▒ vard─▒r hareket gelen collection.abc i├žin typing mod├╝l.

g├Âsteri

 lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(flatten(lst))                                         # nested lists
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

mixed = [[1, [2]], (3, 4, {5, 6}, 7), 8, "9"]              # numbers, strs, nested & mixed
list(flatten(mixed))
# [1, 2, 3, 4, 5, 6, 7, 8, '9']
 

Referans

  • Bu ├ž├Âzelti Beazley, D. ve B. Jones'taki bir tariften de─či┼čtirilmi┼čtir . Tarif 4.14, Python Yemek Kitab─▒ 3. Ed., O'Reilly Media Inc. Sebastopol, CA: 2013.
  • Daha ├Ânce SO yaz─▒ bulundu , muhtemelen orjinal g├Âsteri.

94







Ne kadar i├ž i├že oldu─čunu bilmedi─činiz bir veri yap─▒s─▒n─▒ d├╝zle┼čtirmek istiyorsan─▒z, kullanabilirsiniz 1 iteration_utilities.deepflatten

 >>> from iteration_utilities import deepflatten

>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(deepflatten(l, depth=1))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> l = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
>>> list(deepflatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Bu bir jenerat├Ârd├╝r, b├Âylece sonucu bir list veya daha fazla yinelemeye gerek kalmaz .


Yaln─▒zca bir seviyeyi d├╝zle┼čtirmek ve ├Â─čelerin her birinin kendisinin yinelenebilir olmas─▒ durumunda, iteration_utilities.flatten hangisinin sadece ince bir sar─▒c─▒ oldu─čunu da kullanabilirsiniz itertools.chain.from_iterable :

 >>> from iteration_utilities import flatten
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> list(flatten(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Sadece baz─▒ zamanlamalar─▒ eklemek i├žin (bu cevapta sunulan fonksiyonu i├žermeyen Nico Schl├Âmer cevab─▒na dayanarak):


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Yay─▒lan geni┼č bir de─čer aral─▒─č─▒ i├žin uygun bir log-log arsa. Nitel ak─▒l y├╝r├╝tme i├žin: D├╝┼č├╝k daha iyidir.

Sonu├žlar iterable sadece birka├ž i├ž Iterables i├žeriyorsa o zaman oldu─čunu g├Âstermektedir sum uzun Iterables yaln─▒zca bununla birlikte, en h─▒zl─▒ olacakt─▒r itertools.chain.from_iterable , iteration_utilities.deepflatten makul bir performansa sahip veya i├ž i├že kavrama itertools.chain.from_iterable (zaten Nico Schlomer taraf─▒ndan fark) en h─▒zl─▒ olmak.

 from itertools import chain
from functools import reduce
from collections import Iterable  # or from collections.abc import Iterable
import operator
from iteration_utilities import deepflatten

def nested_list_comprehension(lsts):
    return [item for sublist in lsts for item in sublist]

def itertools_chain_from_iterable(lsts):
    return list(chain.from_iterable(lsts))

def pythons_sum(lsts):
    return sum(lsts, [])

def reduce_add(lsts):
    return reduce(lambda x, y: x + y, lsts)

def pylangs_flatten(lsts):
    return list(flatten(lsts))

def flatten(items):
    """Yield items from any nested iterable; see REF."""
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x

def reduce_concat(lsts):
    return reduce(operator.concat, lsts)

def iteration_utilities_deepflatten(lsts):
    return list(deepflatten(lsts, depth=1))


from simple_benchmark import benchmark

b = benchmark(
    [nested_list_comprehension, itertools_chain_from_iterable, pythons_sum, reduce_add,
     pylangs_flatten, reduce_concat, iteration_utilities_deepflatten],
    arguments={2**i: [[0]*5]*(2**i) for i in range(1, 13)},
    argument_name='number of inner lists'
)

b.plot()
 

1 Feragatname: Ben o k├╝t├╝phanenin yazar─▒y─▒m


42







─░fademi geri al─▒yorum. toplam─▒ kazanan de─čil. Liste k├╝├ž├╝k oldu─čunda daha h─▒zl─▒ olmas─▒na ra─čmen. Ancak performans daha b├╝y├╝k listelerle ├Ânemli ├Âl├ž├╝de azal─▒r.

 >>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10000'
    ).timeit(100)
2.0440959930419922
 

Toplam s├╝r├╝m hala bir dakikadan fazla bir s├╝redir ├žal─▒┼č─▒yor ve hen├╝z i┼člem yap─▒lmad─▒!

Orta listeler i├žin:

 >>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
20.126545906066895
>>> timeit.Timer(
        'reduce(lambda x,y: x+y,l)',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
22.242258071899414
>>> timeit.Timer(
        'sum(l, [])',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
    ).timeit()
16.449732065200806
 

K├╝├ž├╝k listeler ve timeit kullanma: number = 1000000

 >>> timeit.Timer(
        '[item for sublist in l for item in sublist]',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
2.4598159790039062
>>> timeit.Timer(
        'reduce(lambda x,y: x+y,l)',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
1.5289170742034912
>>> timeit.Timer(
        'sum(l, [])',
        'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
    ).timeit()
1.0598428249359131
 

36







Bir kar─▒┼č─▒kl─▒k var gibi g├Âr├╝n├╝yor operator.add ! ─░ki listeyi birlikte ekledi─činizde, bunun i├žin do─čru terim concat eklemektir. operator.concat kullanman gereken ┼čey bu.

─░┼člevsel d├╝┼č├╝n├╝yorsan─▒z, bu kadar kolayd─▒r ::

 >>> from functools import reduce
>>> list2d = ((1, 2, 3), (4, 5, 6), (7,), (8, 9))
>>> reduce(operator.concat, list2d)
(1, 2, 3, 4, 5, 6, 7, 8, 9)
 

Dizi t├╝r├╝ne olan sayg─▒n─▒n azald─▒─č─▒n─▒ g├Âr├╝yorsunuz, bu y├╝zden bir demet sa─člad─▒─č─▒n─▒zda, bir demet geri al─▒rs─▒n─▒z. Bir liste ile deneyelim ::

 >>> list2d = [[1, 2, 3],[4, 5, 6], [7], [8, 9]]
>>> reduce(operator.concat, list2d)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

Aha, tekrar bir listeye d├Ânersin.

Peki ya performans ::

 >>> list2d = [[1, 2, 3],[4, 5, 6], [7], [8, 9]]
>>> %timeit list(itertools.chain.from_iterable(list2d))
1000000 loops, best of 3: 1.36 ┬Ás per loop
 

from_iterable olduk├ža h─▒zl─▒! Ancak ile azaltmak i├žin hi├žbir kar┼č─▒la┼čt─▒rma concat .

 >>> list2d = ((1, 2, 3),(4, 5, 6), (7,), (8, 9))
>>> %timeit reduce(operator.concat, list2d)
1000000 loops, best of 3: 492 ns per loop
 

33







Neden extend kullan─▒yorsunuz?

 reduce(lambda x, y: x+y, l)
 

Bu iyi ├žal─▒┼čmas─▒ gerekir.


30







Django kullan─▒yorsan─▒z tekerle─či yeniden icat etmeyin :

 >>> from django.contrib.admin.utils import flatten
>>> l = [[1,2,3], [4,5], [6]]
>>> flatten(l)
>>> [1, 2, 3, 4, 5, 6]
 

... Pandalar :

 >>> from pandas.core.common import flatten
>>> list(flatten(l))
 

... ─░totools :

 >>> import itertools
>>> flatten = itertools.chain.from_iterable
>>> list(flatten(l))
 

... Matplotlib

 >>> from matplotlib.cbook import flatten
>>> list(flatten(l))
 

... Unipath :

 >>> from unipath.path import flatten
>>> list(flatten(l))
 

... Kurulum Ara├žlar─▒ :

 >>> from setuptools.namespaces import flatten
>>> list(flatten(l))
 

27







more_itertools Paketi kurmay─▒ d├╝┼č├╝n├╝n .

 > pip install more_itertools
 

─░├žin bir uygulama ile gemileri flatten ( kayna─č─▒ndan gelen, itertools tarifleri ):

 import more_itertools


lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.flatten(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
 

2.4 s├╝r├╝m├╝nden itibaren, daha karma┼č─▒k, i├ž i├že yinelenebilirleri more_itertools.collapse ( kaynak , abarnet'in katk─▒lar─▒yla) d├╝zle┼čtirebilirsiniz.

 lst = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
list(more_itertools.collapse(lst)) 
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

lst = [[1, 2, 3], [[4, 5, 6]], [[[7]]], 8, 9]              # complex nesting
list(more_itertools.collapse(lst))
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
 

22







─░┼člevinizin ├žal─▒┼čmamas─▒n─▒n nedeni: extend, diziyi yerinde geni┼čletir ve d├Ând├╝rmez. Hile yaparak lambda'dan yine x'i geri getirebilirsiniz:

 reduce(lambda x,y: x.extend(y) or x, l)
 

Not: geni┼čletme, listelerdeki + i┼čaretlerinden daha verimlidir.


20







 def flatten(l, a):
    for i in l:
        if isinstance(i, list):
            flatten(i, a)
        else:
            a.append(i)
    return a

print(flatten([[[1, [1,1, [3, [4,5,]]]], 2, 3], [4, 5],6], []))

# [1, 1, 1, 3, 4, 5, 2, 3, 4, 5, 6]
 

13


2016-10-26





An─▒l'─▒n yukar─▒daki i┼člevinin k├Ât├╝ bir ├Âzelli─či, kullan─▒c─▒n─▒n ikinci arg├╝man─▒ bo┼č bir liste olarak her zaman manuel olarak belirtmesini gerektirmesidir [] . Bunun yerine varsay─▒lan olmal─▒. Python nesnelerinin ├žal─▒┼čma ┼čekli nedeniyle, bunlar ba─č─▒ms─▒z de─či┼čkenlerde de─čil, i┼člev i├žinde ayarlanmal─▒d─▒r.

─░┼čte ├žal─▒┼čan bir fonksiyon:

 def list_flatten(l, a=None):
    #check a
    if a is None:
        #initialize with empty list
        a = []

    for i in l:
        if isinstance(i, list):
            list_flatten(i, a)
        else:
            a.append(i)
    return a
 

Test yapmak:

 In [2]: lst = [1, 2, [3], [[4]],[5,[6]]]

In [3]: lst
Out[3]: [1, 2, [3], [[4]], [5, [6]]]

In [11]: list_flatten(lst)
Out[11]: [1, 2, 3, 4, 5, 6]
 

12







├ľzyinelemeli versiyonu

 x = [1,2,[3,4],[5,[6,[7]]],8,9,[10]]

def flatten_list(k):
    result = list()
    for i in k:
        if isinstance(i,list):

            #The isinstance() function checks if the object (first argument) is an 
            #instance or subclass of classinfo class (second argument)

            result.extend(flatten_list(i)) #Recursive call
        else:
            result.append(i)
    return result

flatten_list(x)
#result = [1,2,3,4,5,6,7,8,9,10]
 

12







matplotlib.cbook.flatten() ├ľrnekten daha derin i├ž i├že olsalar bile, i├ž i├že ge├žmi┼č listeler i├žin ├žal─▒┼čacakt─▒r.

 import matplotlib
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
print(list(matplotlib.cbook.flatten(l)))
l2 = [[1, 2, 3], [4, 5, 6], [7], [8, [9, 10, [11, 12, [13]]]]]
print list(matplotlib.cbook.flatten(l2))
 

Sonu├ž:

 [1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
 

Bu alt ├žizgi d├╝zleminden 18 kat daha h─▒zl─▒d─▒r.

 Average time over 1000 trials of matplotlib.cbook.flatten: 2.55e-05 sec
Average time over 1000 trials of underscore._.flatten: 4.63e-04 sec
(time for underscore._)/(time for matplotlib.cbook) = 18.1233394636
 

11







Kabul edilen cevap, de─či┼čken uzunluktaki metin tabanl─▒ listelerle u─čra┼č─▒rken benim i├žin i┼če yaramad─▒. ─░┼čte benim i├žin i┼če yarayan alternatif bir yakla┼č─▒m.

 l = ['aaa', 'bb', 'cccccc', ['xx', 'yyyyyyy']]
 

Did cevab─▒ Kabul de─čil i┼č:

 flat_list = [item for sublist in l for item in sublist]
print(flat_list)
['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'c', 'c', 'xx', 'yyyyyyy']
 

Yeni ├ž├Âz├╝m ├Ânerdi mi i┼č i├žin beni:

 flat_list = []
_ = [flat_list.extend(item) if isinstance(item, list) else flat_list.append(item) for item in l if item]
print(flat_list)
['aaa', 'bb', 'cccccc', 'xx', 'yyyyyyy']
 

11







A┼ča─č─▒daki bana en basit g├Âr├╝n├╝yor:

 >>> import numpy as np
>>> l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
>>> print (np.concatenate(l))
[1 2 3 4 5 6 7 8 9]
 

9







Ayr─▒ca NumPy'nin dairesini de kullanabilirsiniz :

 import numpy as np
list(np.array(l).flat)
 

D├╝zenleme 11/02/2016: Yaln─▒zca alt listelerin boyutlar─▒ ayn─▒ oldu─čunda ├žal─▒┼č─▒r.


8


2016-07-17





Numpy kullanabilirsiniz:
flat_list = list(np.concatenate(list_of_list))


6







underscore.py Paket fan i├žin basit kod

 from underscore import _
_.flatten([[1, 2, 3], [4, 5, 6], [7], [8, 9]])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
 

T├╝m d├╝zle┼čtirilmi┼č sorunlar─▒ ├ž├Âzer (hi├žbir liste ├Â─česi veya karma┼č─▒k yuvalama yoktur)

 from underscore import _
# 1 is none list item
# [2, [3]] is complex nesting
_.flatten([1, [2, [3]], [4, 5, 6], [7], [8, 9]])
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
 

underscore.py Pip ile y├╝kleyebilirsiniz

 pip install underscore.py
 

5







 def flatten(alist):
    if alist == []:
        return []
    elif type(alist) is not list:
        return [alist]
    else:
        return flatten(alist[0]) + flatten(alist[1:])
 

5







 flat_list = []
for i in list_of_list:
    flat_list+=i
 

Bu Kod ayr─▒ca listeyi tamamen geni┼čletti─či i├žin gayet iyi ├žal─▒┼č─▒yor. Her ne kadar ├žok benzer olsa da sadece bir d├Âng├╝ i├žin var. Bu y├╝zden d├Âng├╝ler i├žin 2 eklemekten daha az karma┼č─▒kl─▒─ča sahiptir.


5







E─čer daha temiz bir g├Âr├╝n├╝m i├žin h─▒z ├žok az miktarda b─▒rakmaya istekli iseniz, o zaman kullanabilirsiniz numpy.concatenate().tolist() ya numpy.concatenate().ravel().tolist() :

 import numpy

l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]] * 99

%timeit numpy.concatenate(l).ravel().tolist()
1000 loops, best of 3: 313 ┬Ás per loop

%timeit numpy.concatenate(l).tolist()
1000 loops, best of 3: 312 ┬Ás per loop

%timeit [item for sublist in l for item in sublist]
1000 loops, best of 3: 31.5 ┬Ás per loop
 

Daha fazla bilgiyi burada numpy.concatenate ve numpy.ravel belgelerinde bulabilirsiniz.


4







Buldu─čum en h─▒zl─▒ ├ž├Âz├╝m (yine de b├╝y├╝k liste i├žin):

 import numpy as np
#turn list into an array and flatten()
np.array(l).flatten()
 

Bitti! Elbette listeyi (l) y├╝r├╝terek bir listeye d├Ând├╝rebilirsiniz.


4







Bu en etkili yol olmayabilir, ancak bir astar─▒ (asl─▒nda iki astar─▒) koymay─▒ d├╝┼č├╝nd├╝m. Her iki s├╝r├╝m de keyfi i├ž i├že ge├žmi┼č listelerde ├žal─▒┼čacak ve dil ├Âzelliklerini (Python3.5) ve yinelemeyi kullanacakt─▒r.

 def make_list_flat (l):
    flist = []
    flist.extend ([l]) if (type (l) is not list) else [flist.extend (make_list_flat (e)) for e in l]
    return flist

a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = make_list_flat(a)
print (flist)
 

Çıktı

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
 

Bu ilk ├Ânce derinlemesine ├žal─▒┼č─▒r. ├ľzyineleme, liste d─▒┼č─▒ bir ├Â─če bulana kadar a┼ča─č─▒ iner, ard─▒ndan yerel de─či┼čkeni geni┼čletir flist ve sonra ├╝ste geri al─▒r. Her flist iade flist edildi─činde listedeki anlamada ebeveyne uzat─▒l─▒r . Bu nedenle k├Âkte d├╝z bir liste d├Ând├╝r├╝l├╝r.

Yukar─▒dakiler birka├ž yerel liste olu┼čturur ve bunlar─▒ ├╝st listeyi geni┼čletmek i├žin kullan─▒lanlar─▒ d├Ând├╝r├╝r. San─▒r─▒m bunun i├žin yol flist , a┼ča─č─▒daki gibi bir gloabl olu┼čturmak olabilir .

 a = [[1, 2], [[[[3, 4, 5], 6]]], 7, [8, [9, [10, 11], 12, [13, 14, [15, [[16, 17], 18]]]]]]
flist = []
def make_list_flat (l):
    flist.extend ([l]) if (type (l) is not list) else [make_list_flat (e) for e in l]

make_list_flat(a)
print (flist)
 

├ç─▒k─▒┼č tekrar

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
 

Her ne kadar ┼ču anda verimlilik konusunda emin de─čilim.


4







Not : A┼ča─č─▒da Python 3.3+ i├žin ge├žerlidir, ├ž├╝nk├╝ kullanmaktad─▒r yield_from . six Ayn─▒ zamanda ├╝├ž├╝nc├╝ parti bir pakettir, kararl─▒ olmas─▒na ra─čmen. Alternatif olarak kullanabilirsiniz sys.version .


Bu durumda, obj = [[1, 2,], [3, 4], [5, 6]] liste kavrama ve dahil t├╝m buradaki ├ž├Âz├╝mler iyidir itertools.chain.from_iterable .

Ancak, bu biraz daha karma┼č─▒k bir durum d├╝┼č├╝n├╝n:

 >>> obj = [[1, 2, 3], [4, 5], 6, 'abc', [7], [8, [9, 10]]]
 

Burada birka├ž sorun var:

  • Bir eleman,, 6 sadece bir skalerdir; yinelenebilir de─čil, bu y├╝zden yukar─▒daki yollar burada ba┼čar─▒s─▒z olacak.
  • Bir eleman, 'abc' , olup (teknik olarak iterable str s) vard─▒r. Bununla birlikte, sat─▒rlar aras─▒nda biraz okuma yaparak, b├Âyle davranmak istemezsiniz - onu tek bir eleman olarak g├Ârmek istersiniz.
  • Son eleman, [8, [9, 10]] kendisi yuvalanm─▒┼č bir yinelenebilir. Temel liste anlay─▒┼č─▒ ve chain.from_iterable sadece "1 seviye a┼ča─č─▒" ay─▒klay─▒n.

Bunu ┼ču ┼čekilde d├╝zeltebilirsiniz:

 >>> from collections import Iterable
>>> from six import string_types

>>> def flatten(obj):
...     for i in obj:
...         if isinstance(i, Iterable) and not isinstance(i, string_types):
...             yield from flatten(i)
...         else:
...             yield i


>>> list(flatten(obj))
[1, 2, 3, 4, 5, 6, 'abc', 7, 8, 9, 10]
 

Burada, alt ├Â─čenin (1) Iterable bir ABC ile yinelenebilir oldu─čunu kontrol eder itertools , ancak ayn─▒ zamanda (2) ├Â─čenin "string benzeri" olmad─▒─č─▒ndan emin olmak istersiniz.


4







Tamsay─▒n─▒n hetero ve homojen listeleri i├žin ├žal─▒┼čan s─▒ra d─▒┼č─▒ bir yakla┼č─▒m:

 from typing import List


def flatten(l: list) -> List[int]:
    """Flatten an arbitrary deep nested list of lists of integers.

    Examples:
        >>> flatten([1, 2, [1, [10]]])
        [1, 2, 1, 10]

    Args:
        l: Union[l, Union[int, List[int]]

    Returns:
        Flatted list of integer
    """
    return [int(i.strip('[ ]')) for i in str(l).split(',')]
 

4







Kullanarak basit bir ├Âzyinelemeli y├Ântem reduce gelen functools ve add listelerde operat├Âr├╝:

 >>> from functools import reduce
>>> from operator import add
>>> flatten = lambda lst: [lst] if type(lst) is int else reduce(add, [flatten(ele) for ele in lst])
>>> flatten(l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
 

─░┼člev parametre olarak flatten al─▒r lst . Bu t├╝m unsurlar─▒ d├Âng├╝ler lst ula┼čan tamsay─▒lard─▒r (ayn─▒ zamanda de─či┼čtirebilir kadar int ├╝zere float , str en d─▒┼č yineleme d├Ân├╝┼č de─čeri ilave edilir, di─čer veri tipleri i├žin, vs.).

├ľzyineleme, for d├Âng├╝ler ve monadlar gibi y├Ântemlerin aksine , liste derinli─či ile s─▒n─▒rl─▒ olmayan genel bir ├ž├Âz├╝m olmas─▒d─▒r . ├ľrne─čin, 5 derinli─či olan bir liste ┼ču ┼čekilde d├╝zle┼čtirilebilir l :

 >>> l2 = [[3, [1, 2], [[[6], 5], 4, 0], 7, [[8]], [9, 10]]]
>>> flatten(l2)
[3, 1, 2, 6, 5, 4, 0, 7, 8, 9, 10]
 

4



─░lgili yay─▒nlar


├çok say─▒da dize de─čerine sahip bir dizeler listesi (List <string>) nas─▒l ba┼člat─▒l─▒r

Bir ├╝ye listesini bireysel listelerde nas─▒l a├žar─▒m? [├žift]

Python'da bir liste d─▒┼č─▒ liste ├Â─česi nas─▒l olu┼čturulur?

Hi├žbiri Liste D─▒┼č─▒ [Se├ženek] d─▒┼č─▒nda nas─▒l filtrelenir?

C#: Nas─▒l bir nesne listesi, o nesnenin tek bir ├Âzelli─činin listesine d├Ân├╝┼čt├╝r├╝l├╝r?

Yaml de ili┼čkisel dizilerin listesi nas─▒l yap─▒l─▒r

Underscore.js: nesnede bulunan bir anahtar─▒ kullanarak nesne listesinin d─▒┼č─▒nda bir harita olu┼čturun

ES6 s─▒n─▒f─▒ndan bir yineleyici nas─▒l yap─▒l─▒r

Bir <a hrefÔÇŽ>ÔÇŽ </a> ba─člant─▒s─▒ndan g├Ânderim nas─▒l yap─▒l─▒r?

RxJava: Nesnelerin listesi ba┼čka bir nesnelerin listesine nas─▒l d├Ân├╝┼čt├╝r├╝l├╝r

Etiketle ilgili di─čer sorular [python]


C# dilinde ├žok sat─▒rl─▒ dize de─či┼čmezi

Yay─▒nlanmam─▒┼č git taahh├╝tlerini nas─▒l silebilirim?

ÔÇťSembol bulunam─▒yorÔÇŁ derleme hatas─▒ ne anlama gelir?

log4net vs. Nlog

Ne var 'var that = this;' JavaScript'te demek?

En kullan─▒┼čl─▒ NLog konfig├╝rasyonlar─▒ [kapal─▒]

Eclipse art─▒k referanslar─▒ vurgulam─▒yor

ASP.NET'in Gizli ├ľzellikleri [kapal─▒]

Mevcut tabloya Yabanc─▒ Anahtar ekle

Python'da ÔÇťsaat dilimi fark─▒ndaÔÇŁ olan bir datetime.today () de─čerini nas─▒l alabilirim?