2010-01-26 2 views
21

मेरे पास अजगर में एक सूची है और मैं इसके माध्यम से पुन: प्रयास करना चाहता हूं, और चुनिंदा रूप से उस सूची का निर्माण करना जिसमें वर्तमान k'th तत्व को छोड़कर सभी तत्व शामिल हैं। एक तरीका यह है कि मैं यह कर सकता हूं:k'th तत्व के बिना कुशलतापूर्वक और विनाशकारी रूप से सूची प्राप्त करना

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) 

लेकिन यह अक्षम और सुरुचिपूर्ण लगता है। क्या ऐसा करने का कोई आसान तरीका है? नोट मैं अनिवार्य रूप से मूल सूची का एक टुकड़ा प्राप्त करना चाहता हूं जिसमें वर्तमान तत्व शामिल नहीं है। ऐसा लगता है कि ऐसा करने का एक आसान तरीका होना चाहिए।

आपकी मदद के लिए धन्यवाद।

+0

एक और तरीका है मैं कर इस प्रकार है के बारे में सोचा: # मान कश्मीर है तत्व को फ़िल्टर (लैम्ब्डा x: x [0]! = के, एल) को बाहर रखा जाना चाहिएयह सम्मानजनक है? क्या बेहतर तरीके हैं? – user248237dfsf

+0

क्या आप मुझे समझा सकते हैं कि अपेक्षित परिणाम क्या है? "NameError: name 'copy' को परिभाषित नहीं किया गया है" – Pepijn

+2

यह मुझे स्पष्ट नहीं है कि इस ऑपरेशन का नतीजा क्या है। आपके द्वारा पोस्ट किए गए कार्यान्वयन को मूल सूची की 3 अलग-अलग प्रतियों का उपयोग नहीं किया जाता है, जिसमें तीन अलग-अलग तत्व अनुपलब्ध होते हैं। क्या आप अपने लक्ष्यों को स्पष्ट कर सकते हैं? –

उत्तर

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

क्या आप यह चाहते हैं?

+2

+1, निश्चित रूप से सिर और कंधे का सबसे अच्छा तरीका! जब आप टुकड़ा कर सकते हैं और संयोजित कर सकते हैं तो क्यों पुन: प्रयास करें? -) –

+0

क्या यह सभी के Beefster

8

यदि आप और अधिक समझाते हैं कि आप इसका उपयोग कैसे करना चाहते हैं तो इससे मदद मिलेगी। लेकिन आप सूची समझ के साथ ऐसा ही कर सकते हैं।

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

यह भी अधिक स्मृति से अधिक पुनरावृति करने के लिए यदि आप l_without_num में संग्रहीत करना नहीं है कुशल है।

0

शायद सबसे कुशल नहीं है, लेकिन मेरे में कार्यात्मक प्रोग्रामर शायद यह लिखेंगे।

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) 

मैं यह करने के सही बात है नहीं लगता है, लेकिन यह कम है। :-)

+0

शायद वहां एक आइफिलटर होना चाहिए? :) –

+0

क्या डाउनवॉटर कृपया टिप्पणी करेंगे क्यों? पहला समाधान परिणाम और एल्गोरिदमिक जटिलता में अग्रणी उत्तर के बराबर है। – 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

सेट पर अंतर ऑपरेटर का उपयोग करना:

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

l=[('a', 1), ('b', 2), ('c', 3)] 
list(set(l).difference([l[1]])) 
[('a', 1), ('c', 3)] 
संबंधित मुद्दे