Ich habe jetzt eine List wie z.B
Code: Alles auswählen
[a,[b,[c]]]
Code: Alles auswählen
[a,b,c]
was meint ihr?
Grüßen
Code: Alles auswählen
[a,[b,[c]]]
Code: Alles auswählen
[a,b,c]
Code: Alles auswählen
def foo(lst):
if len(lst) == 1:
return lst
else:
head,tail=lst
return [head] + foo(tail)
if __name__ =='__main__':
a =['a', ['b', ['c']]]
print foo(a)
Gut, aber das würde ich schon von der Aufgabe abhängig machen. Sonst würde ich das ganze so lösen:lunar hat geschrieben:Naja, es ist rekursiv, was in Python aufgrund des Rekursionslimits immer ein bisschen blöd ist. Eine iterative Implementierung wäre besser.
Code: Alles auswählen
def flatten(list_):
for idx, elem in enumerate(list_):
next_idx = idx + 1
try:
next_elem = list_[next_idx]
except IndexError:
pass
else:
del list_[next_idx]
list_.extend(next_elem)
if __name__ == '__main__':
foo = [1, [2, [3, [4]]]]
flatten(foo)
print foo
Code: Alles auswählen
def flatten(list_of_lists):
return list(chain.from_iterable(list_of_lists))
Code: Alles auswählen
def flatten(list_of_lists):
return list(chain(*list_of_lists))
Code: Alles auswählen
def flatten(list_of_lists):
return list(chain(*[list_of_lists]))
Code: Alles auswählen
In [20]: x = [1, [2, [3, [4, 5]]]]
In [21]: flatten(x)
Out[21]: [1, [2, [3, [4, 5]]]]
Code: Alles auswählen
In [25]: flatten([[1, 2, 3], [4], [5, 6]])
Out[25]: [1, 2, 3, 4, 5, 6]
Das ist aber sehr suboptimal, da es mehrere verschachtelte listen nicht flattened.Y0Gi hat geschrieben:Code: Alles auswählen
def flatten(list_of_lists): return list(chain(*[list_of_lists]))
Code: Alles auswählen
from collections import deque
def smash_down(list_):
q = deque(list_)
result = list()
while q:
data = q.popleft()
if hasattr(data, "__iter__") and not isinstance(data, basestring):
data = list(reversed(list(data)))
q.extendleft(data)
else:
result.append(data)
return result
if __name__ == '__main__':
foo = [[['a', ('foo', 'bar'), 'b'], 'c'], 1, [iter(['x', 'y', 'z']), 99], [2, 'asdf', [3, ([4],)]]]
print smash_down(foo)
foo = [1, [2, [3]]]
print smash_down(foo)
Klar; ich hatte übersehen, dass das `flatten`-Rezept nicht für den hier gewünschten Zweck geeignet/gedacht ist.str1442 hat geschrieben:Der TypeError kommt vom ersten Element der Liste, das als Integer keine Iterierung unterstützt.
Das kann ich so nicht stehen lassen. Mit dem Asterisk wird die folgende Sequenz quasi aufgelöst und ihre Elemente einzeln weitergegeben. Das ist im Zusammenhang mit Callable-Aufrufen sinnvoll, weil man dann eine Liste wie eine Liste von Argumenten für eine Callable verwenden kann. Analog gilt das für dicts und Keyword-Argumente.str1442 hat geschrieben:"*(foo,)" oder "*[foo]" ist aquivalent zu "foo".
Code: Alles auswählen
def foo(*args, **kwargs):
print args
print kwargs
>>> a = [1, 2, 3]
>>> b = {'a': 1, 'b': 2}
>>> foo(a)
([1, 2, 3],)
{}
>>> foo(b)
({'a': 1, 'b': 2},)
{}
>>> foo(*a)
(1, 2, 3)
{}
>>> foo(*b)
('a', 'b')
{}
>>> foo(**b)
()
{'a': 1, 'b': 2}
Könnte man das dann so erschlagen?lunar hat geschrieben:Nicht alles, was iterable ist, hat eine __iter__-Methode.
Code: Alles auswählen
from collections import deque
def smash_down(list_):
q = deque(list_)
result = list()
while q:
data = q.popleft()
try:
iter(data)
iterable = True
except TypeError:
iterable = False
if iterable and not isinstance(data, basestring):
data = list(reversed(list(data)))
q.extendleft(data)
else:
result.append(data)
return result
Code: Alles auswählen
In [1]: def f(element): print element
...:
In [2]: f(*("Dummy",))
Dummy
In [3]: f(*["Dummy"])
Dummy
Aua! Sie geben von der liste jeweils ein element als ein argument zur Funktion.str1442 hat geschrieben:@Y0Gi
?
*("Dummy",) == "Dummy".Code: Alles auswählen
In [1]: def f(element): print element ...: In [2]: f(*("Dummy",)) Dummy In [3]: f(*["Dummy"]) Dummy
Was die Sternchen machen, weiß ich
Code: Alles auswählen
return list(chain(*[list_of_lists]))