2009-08-20 20 views

Antwort

12

Für verschachtelte Listen können Sie verschachtelte Liste Comprehensions verwenden:

nested_list = [[s.upper() for s in xs] for xs in nested_list] 

persönlich map finde ich in dieser Situation sauberer zu sein, obwohl ich fast immer Listenkomprehensionen bevorzugen. Also ist es wirklich dein Anruf, da beides funktionieren wird.

+0

Ah natürlich. Ich muss müde sein als sonst. – kjfletch

+0

in py3k map erfordert eine Liste, die darauf angewendet werden soll. – SilentGhost

3

Karte ist sicherlich eine viel sauberere Art zu tun, was Sie wollen. Sie können die Listenkomprehensionen verschachteln, vielleicht ist es das, wonach Sie suchen?

[[ix.upper() for ix in x] for x in nested_list] 
+0

Ja, es mag sauberer sein, aber ich würde gerne einen Generator benutzen. – kjfletch

0

Andere Plakate haben die Antwort gegeben, aber immer, wenn ich Probleme habe meinen Kopf Umwickeln eines funktionellen Konstrukts, ich meinen Stolz schlucken und es buchstabieren Langschrift mit explizit nicht optimalen Methoden und/oder Objekte. Sie sagten, Sie mit einem Generator, um am Ende wollen, so:

for xs in n_l: 
    def doUpper(l): 
     for x in l: 
      yield x.upper() 
    yield doUpper(xs) 

for xs in n_l: 
    yield (x.upper() for x in xs) 

((x.upper() for x in xs) for xs in n_l) 

Manchmal sauberer es ist eine der Langschrift Versionen zu halten. Für mich machen Map und Reduction es manchmal offensichtlicher, aber Python-Idiome könnten für andere offensichtlicher sein.

2

Erinnern Sie sich das Zen von Python.

Es ist in der Regel mehr als ein - und wahrscheinlich mehr - offensichtliche Möglichkeiten, es zu tun **

** Hinweis: Herausgegeben für die Genauigkeit.

Wie auch immer, ich bevorzuge Karte.

from functools import partial 
nested_list = map(partial(map, str.upper), nested_list) 
+0

Wow. Anscheinend verletzte mein kleiner Witz über das Zen von Python wirklich jemandes Gefühle (und daher den Downvote). Erleichtere dich, Leute! (FWIW, ich bin 100% aufrichtig bei der Verwendung von 'map' in diesem Fall.) –

+1

" Es sollte [...] geben ", +1 für die Wahrheitsangabe x-) – Edouard

1

Hier Lösung für verschachtelte Liste, die beliebige Tiefe hat:

def map_nlist(nlist=nlist,fun=lambda x: x*2): 
    new_list=[] 
    for i in range(len(nlist)): 
     if isinstance(nlist[i],list): 
      new_list += [map_nlist(nlist[i],fun)] 
     else: 
      new_list += [fun(nlist[i])] 
    return new_list 

Sie in Großbuchstaben wollen alle Listenelement, geben Sie einfach

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]] 
In [27]: map_nlist(nested_list,fun=str.upper) 
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]] 

Und mehr wichtig, diese rekursive Funktion kann mehr als das!

Ich bin neu in Python, fühlen Sie sich frei zu diskutieren!

+0

Verwenden Sie' append' anstelle von '+ =' , um zu vermeiden, dass für jeden Artikel eine neue Liste erstellt wird. –

+0

@IoannisFilippidis Filippidis Hey vielen Dank für die Antwort, aber können Sie mir mehr Details über das Problem mit + =? Ich verstehe den Unterschied nicht ganz ... (lange Zeit keine Verwendung von Python ..) – freeyoung

+1

Lassen Sie 'a = list()'. Mit 'a.append (0)' wird die gleiche 'list' Instanz um ein Element erweitert. Im Gegensatz dazu erzeugt 'a + = [0] 'eine neue Liste' [0] ', die dann aus dem Speicher gelöscht wird. Korrektur zu meinem früheren Kommentar: Ich dachte, dass "__iadd__" wie "__add__" funktioniert, aber die Verwendung von "id" hat ergeben, dass dies nicht der Fall ist. Weitere Details finden Sie [hier] (http://stackoverflow.com/questions/9766387/different-behaviour-for-list-iadd-and-list-add). –