2013-05-16 13 views
8

कहो में हैं मैं एक सूची है पर:अजगर सूची निर्भर छँटाई यदि आइटम एक और सूची

A = [1,2,3,4,5,6,7,8,9,0] 

और एक दूसरी सूची:

B = [3,6,9] 

क्या सूची एक ताकि सॉर्ट करने के लिए सबसे अच्छा तरीका है कुछ भी है कि सूची बी के आइटम से मिलान शुरुआत में दिखाई देंगे ताकि परिणाम होगा:

[3,6,9,1,2,4,5,7,8,0] 
+4

क्या बी जरूरी है? – rspencer

+0

नहीं, ए और बी शुरू करने के लिए किसी भी क्रम में हो सकते हैं। उन्हें तब तक अंत में क्रमबद्ध करने की आवश्यकता नहीं है जब तक कि बी में से कोई ए – Ashy

+0

@ एशी में लोगों के सामने आते हैं, आपको क्या मतलब है कि वे * जरूरी * क्रमबद्ध करने की आवश्यकता नहीं है, क्या आप उन्हें सॉर्ट करना चाहते हैं अंततः? – jamylak

उत्तर

11
>>> A = [1,2,3,4,5,6,7,8,9,0] 
>>> B = [3,6,9] 
>>> sorted(A,key=lambda e: e not in B) 
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0] 

यह कैसे काम करता है:

sorted प्रत्येक तत्व (key के लिए डिफ़ॉल्ट मान None जिसमें यह तत्वों पर सीधे आधारित परिणाम क्रमांकन है) के लिए key(element) का परिणाम के आधार पर एक interable क्रमबद्ध करता है।

हमारे मामले में लैम्ब्डा lambda e: e not in B वापस आ जाएगी या तो True अगर eB में, या False अगर eB में है नहीं है। False के साथ तत्व को सामने लाया गया है, और आप अपने परिणाम के साथ समाप्त हो जाते हैं।

>>> sorted([True,False,False]) 
[False, False, True] 
+0

प्रश्न के लिए अद्यतन: 'ए' किसी भी क्रम में हो सकता है, इसलिए यह वर्तमान में – jamylak

+0

@jamylak काम नहीं करता है: लेकिन ओपी ने यह भी कहा कि सटीक आउटपुट ऑर्डर कोई फर्क नहीं पड़ता है, और उदाहरण ओपी ने दिया - '[ 3,6,9,1,2,4,5,7,8,0] '- क्रमबद्ध होने के बजाय मूल आदेश को संरक्षित करता है। तो मुझे लगता है कि यह समाधान काम करता है (हालांकि यदि आकार बड़े होते हैं तो बी को एक सेट में बदलने का अर्थ हो सकता है)। – DSM

+0

@DSM अच्छा बिंदु, यह प्रश्न मुझे – jamylak

2
>>> A = [1,2,3,4,5,6,7,8,9,0] 
>>> B = [3,6,9] 
>>> [i for i in B if i in A] + [i for i in A if i not in B] 
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0] 
0

नोट:: द्वारा प्रदर्शन के रूप में - लेकिन अनूठी कुंजियाँ दिया काम करता है इस डुप्लिकेट मानों को हटा देगा।

यदि दोनों पहले से ही हल कर रहे हैं (या अन्य प्रकार के रूप में आप चाहते हैं का आदेश दिया), तो आप उपयोग कर सकते हैं:

A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 
B = [3, 6, 9] 

from collections import OrderedDict 
from itertools import chain 

print list(OrderedDict.fromkeys(chain(B, A))) 
# [3, 6, 9, 1, 2, 4, 5, 7, 8, 0] 

अन्यथा, बस sorted करने के लिए A, B या दोनों लागू ...

+0

क्या होगा यदि 'बी' में कोई आइटम' ए' में नहीं है, तो मुझे नहीं लगता कि हमें इसे – jamylak

3

कई इन उत्तरों में से स्पष्ट रूप से सेट तर्क का उपयोग कर रहे हैं। लेकिन अजगर यह में बनाया गया है, तो के रूप में आप कहते हैं, आदेश नहीं मामले के रूप में लंबे समय तक B भागों पहले आओ के रूप में करता है, इस बाकी की देखभाल करेंगे:।

B = set(B) 
list(B.intersection(A)) + list(set(A) - B) 

मतलब यह है कि (में के रूप में अपने उदाहरण) कोई डुप्लिकेट मान नहीं हैं। यदि वहां हैं, तो सूची समझ में से एक जवाब का उपयोग करें।

+1

+1 सूची में जोड़ना चाहिए, लेकिन मैं '>>> ए, बी = सेट (ए), सेट (बी) ' ' >>> सूची (ए और बी) + सूची (ए - बी) 'यह भी तेज़ होना चाहिए क्योंकि' बी 'को निश्चित रूप से' सेट 'में दो बार परिवर्तित करने की आवश्यकता नहीं है जैसे यह इस मामले में करता है। इसके अलावा 'ए' को' सेट 'में दो बार – jamylak

+0

@jamylak में परिवर्तित कर दिया गया है, वह पूरी चीज को' ए [:] 'पर फिर से सौंपना चाहती है, इसलिए मैंने आपकी सलाह ली, लेकिन' ए 'के स्थायी' सेट 'को छोड़ दिया। – kojiro

+0

फिर चर सेट करें 'set_A' और' set_B' .... – jamylak

2
>>> A = [1,2,3,4,5,6,7,8,9,0] 
>>> B = [3,6,9] 
>>> b = set(B) 
>>> sorted(A, key=b.__contains__, reverse=True) 
[3, 6, 9, 1, 2, 4, 5, 7, 8, 0] 
+0

+1 अच्छा समाधान – jamylak

संबंधित मुद्दे