2010-01-26 8 views
21

Ich habe eine Liste in Python und ich würde gerne durchlaufen, und selektiv eine Liste, die alle Elemente mit Ausnahme der aktuellen k-ten Element enthält. Eine Möglichkeit, die ich tun kann, ist dies:Liste ohne k'th Element effizient und nicht-destruktiv

l = [('a', 1), ('b', 2), ('c', 3)] 
for num, elt in enumerate(l): 
    # construct list without current element 
    l_without_num = copy.deepcopy(l) 
    l_without_num.remove(elt) 

aber das scheint ineffizient und unelegant. Gibt es einen einfachen Weg, es zu tun? Hinweis Ich möchte im Wesentlichen ein Stück der ursprünglichen Liste erhalten, das das aktuelle Element ausschließt. Es scheint, als sollte es einen einfacheren Weg geben, dies zu tun.

danke für Ihre Hilfe.

+0

eine andere Weise, die ich tun dachte, das wie folgt lautet: # annehmen k das auszuschließende Element Filter (Lambda x: x [0]! = k, l) ist das respektabel? Gibt es bessere Wege? – user248237dfsf

+0

Können Sie mir erklären, was das erwartete Ergebnis ist? "NameError: Name 'Kopie' ist nicht definiert" – Pepijn

+2

Es ist mir nicht klar, was das Ergebnis dieser Operation sein soll. Die von Ihnen gepostete Implementierung erstellt drei verschiedene Kopien der ursprünglichen Liste, wobei drei verschiedene Elemente fehlen. Kannst du deine Ziele klarstellen? –

Antwort

53
l = [('a', 1), ('b', 2), ('c', 3)] 
k = 1 
l_without_num = l[:k] + l[(k + 1):] 

Ist das was du willst?

+2

+1, definitiv Kopf und Schultern der beste Weg! Warum iterieren, wenn man schneiden und verketten kann? -) –

+0

Funktioniert das für alle k Beefster

8

Es würde helfen, wenn Sie mehr erklären würden, wie Sie es benutzen wollten. Aber Sie können das gleiche mit Listenverständnis tun.

l = [('a', 1), ('b', 2), ('c', 3)] 
k = 1 
l_without_num = [elt for num, elt in enumerate(l) if not num == k] 

Dies ist auch mehr Speicher effizient, wenn Sie es in l_without_num speichern nicht zu iterieren haben.

0

Wahrscheinlich nicht die effizienteste, aber der funktionale Programmierer in mir würde wahrscheinlich dies schreiben.

import operator 
from itertools import * 
def inits(list): 
    for i in range(0, len(list)): 
     yield list[:i] 
def tails(list): 
    for i in range(0, len(list)): 
     yield list[i+1:] 
def withouts(list): 
    return imap(operator.add, inits(list), tails(list)) 

for elt, without in izip(l, withouts(l)): 
    ... 

import functools, operator 
for elt in l: 
    without = filter(functools.partial(operator.ne, elt), l) 

Ich glaube nicht, dass die Recht Sache zu tun, aber es ist kurz. :-)

+0

Vielleicht sollte da ein Filter drin sein? :) –

+0

Würde Downvoters bitte kommentieren warum? Die erste Lösung entspricht der führenden Antwort in Bezug auf Ergebnisse und algorithmische Komplexität. – ephemient

2
l=[('a', 1), ('b', 2), ('c', 3)] 
k=1 
l_without_num=l[:] # or list(l) if you prefer 
l_without_num.pop(k) 
1
#!/bin/bash 
`python -c "'\n'.join(mylist[:])" 2>NULL | sed '/mybadelement/d'` 

lol

0

Mit Differenzoperator auf Sätze:

list(set(l).difference([l[k]]) 

l=[('a', 1), ('b', 2), ('c', 3)] 
list(set(l).difference([l[1]])) 
[('a', 1), ('c', 3)] 
Verwandte Themen