2017-02-06 6 views
7

मैं निम्नलिखित सूची है:फूट डालो सूची तत्वों के आधार पर मूल्य

initial_list = [['B', 'D', 'A', 'C', 'E']] 

सूची मैं एक समारोह लागू के प्रत्येक तत्व पर है और एक शब्दकोश में परिणाम रख:

for state in initial_list: 
    next_dict[state] = move([state], alphabet) 

यह निम्न परिणाम देता है:

next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']} 

मुझे क्या करना चाहते हैं अलग initial_list से चाबी के आधार पर है उनके next_dict शब्दकोश में मूल्यों, मूल रूप से समूह next_dict में समान मान के साथ तत्वों के लिए पहली सूची के तत्वों:

new_list = [['A', 'C'], ['B', 'E'], ['D']] 

क्योंकि वे एक ही है 'ए' और 'सी' एक ही समूह में रहना होगा मूल्य 'सी', 'बी' और 'डी' भी वही समूह साझा करेंगे क्योंकि उनका मान 'डी' है और फिर 'डी' अपने स्वयं के समूह में होगा।

मैं इस परिणाम को कैसे प्राप्त कर सकता हूं?

+0

प्रारंभिक सूची संभवतः wr एक सूची में एक सूची के रूप में ओएनजी। –

+0

मैं सिर्फ पहली सूची को द्विपक्षीय से समान मूल्य वाले समूहों में विभाजित करना चाहता हूं – Meryem

उत्तर

2

इस प्रयास करें:

next_next_dict = {} 
for key in next_dict: 
    if next_dict[key][0] in next_next_dict: 
     next_next_dict[next_dict[key][0]] += key 
    else: 
     next_next_dict[next_dict[key][0]] = [key] 
new_list = next_next_dict.values() 

या इस

>>> from itertools import groupby 
>>> next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']} 
>>> initial_list = ['B', 'D', 'A', 'C', 'E'] 

>>> [list(i) for _, i in groupby(sorted(initial_list, key=next_dict.get), next_dict.get)] 
[['A', 'C'], ['B', 'E'], ['D']] 
4

आप groupby, next_dict मूल्यों से अपनी सूची अनुसार क्रमबद्ध करने के बाद की जरूरत है:

यह एक को तोड़ने या नया समूह हर बार (कुंजी समारोह परिवर्तन के मूल्य उत्पन्न करता है, जिसके कारण यह आम तौर पर आवश्यक है करने के लिए समान कुंजी फ़ंक्शन का उपयोग कर डेटा को क्रमबद्ध करें)।

from itertools import groupby 

initial_list = ['B', 'D', 'A', 'C', 'E'] 

def move(letter): 
    return {'A': 'C', 'C': 'C', 'D': 'E', 'E': 'D', 'B': 'D'}.get(letter) 
sorted_list = sorted(initial_list, key=move) 
print [list(v) for k,v in groupby(sorted_list, key=move)] 
#=> [['A', 'C'], ['B', 'E'], ['D']] 
2

हम अपने शब्दकोश मानचित्रण के साथ अपनी सूची सॉर्ट कर सकते हैं, और फिर itertools.groupby का उपयोग समूह बनाने की। यहां बनाया गया एकमात्र संशोधन आपकी आरंभिक सूची को एक वास्तविक फ्लैट सूची बना रहा है। इस लक्ष्य को हासिल करने के लिए

new_list = [] 
for value in next_dict.values(): 
    new_value = [key for key in next_dict.keys() if next_dict[key] == value] 
    if new_value not in new_list: 
     new_list.append(new_value) 
3

सबसे आसान तरीका dict.get के रूप में के रूप में कुंजी के साथ itertools.groupby उपयोग करने के लिए किया जाएगा:

>>> from itertools import groupby 
>>> initial_list = ['B', 'D', 'A', 'C', 'E'] 
>>> next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']} 
>>> s_key = lambda x: next_dict[x] 
>>> [list(v) for k, v in groupby(sorted(initial_list, key=s_key), key=s_key)] 
[['A', 'C'], ['B', 'E'], ['D']] 
3

मैं सटीक नहीं हूँ y यह सुनिश्चित करें कि आप क्या चाहते है, लेकिन आप यह कर सकते समूह next_dict में अपने मूल्यों पर आधारित मान:

>>> next_dict = {'D': 'E', 'B': 'D', 'A': 'C', 'C': 'C', 'E': 'D'} 

>>> # external library but one can also use a defaultdict. 
>>> from iteration_utilities import groupedby 

>>> groupings = groupedby(['B', 'D', 'A', 'C', 'E'], key=next_dict.__getitem__) 
>>> groupings 
{'C': ['A', 'C'], 'D': ['B', 'E'], 'E': ['D']} 

और फिर उनके मूल्यों की एक सूची है कि परिवर्तित:

>>> list(groupings.values()) 
[['A', 'C'], ['D'], ['B', 'E']] 

सब कुछ कम्बाइन एक लाइनर में (वास्तव में अनुशंसित नहीं है लेकिन बहुत से लोग इसे पसंद करते हैं):

>>> list(groupedby(['B', 'D', 'A', 'C', 'E'], key=next_dict.__getitem__).values()) 
[['A', 'C'], ['D'], ['B', 'E']] 
संबंधित मुद्दे