2013-01-04 14 views
5

क्षमा करें अगर इसका उत्तर कहीं और दिया गया है; मैंने खोज करने की कोशिश की है, लेकिन मेरे प्रश्न का उत्तर देने वाले कुछ भी नहीं मिला है (या शायद मेरे पास है, लेकिन इसे समझ में नहीं आया है ...पायथन - सूचियों की सूची में तत्वों को छंटनी

मैं पाइथन (v2.6.2) के लिए बिल्कुल नया हूं

cat = [[152.123, 150.456, 151.789, ...], [4.123, 3.456, 1.789, ...], [20.123, 22.456, 21.789, ...]] 

अब मैं करना चाहते हैं क्या सभी तरह सूचियों में से 3: चल बिन्दु मान जो निम्नलिखित तरह दिखता युक्त सूचियों की एक सूची (पूर्ण बात को छोड़कर प्रत्येक सूची के लिए 2 + लाख प्रविष्टियां हैं) तीसरी सूची के तत्वों के आरोही क्रम से, जैसे कि मुझे मिलता है:

cat_sorted = [[152.123, 151.789, 150.456, ...], [4.123, 1.789, 3.456, ...], [20.123, 21.789, 22.456, ...]] 

मैंने कोशिश की है कुछ चीजें, लेकिन वे मुझे वह नहीं देते जो मैं ढूंढ रहा हूं (या शायद मैं उन्हें गलत तरीके से उपयोग कर रहा हूं)। क्या मैं ऐसा करने का कोई तरीका है जिसे मैं ढूंढ रहा हूं और यदि हां, तो सबसे आसान & सबसे तेज़ क्या है (मेरे पास 3 x 2million प्रविष्टियां हैं)? क्या किसी अन्य का उपयोग करके एक सूची को सॉर्ट करने का कोई तरीका है?

+0

बस सोच रहा है कि यह किस तरह की समस्या है और क्या पाइथन वास्तव में उपयुक्त है? मैंने डेटा की ऐसी मात्रा के साथ कार्यों के लिए पायथन का उपयोग करने के किसी भी मामले को नहीं देखा है .. – Ixanezis

उत्तर

8

इस दर्दनाक होने जा रहा है, लेकिन डिफ़ॉल्ट अजगर का उपयोग कर आप 2 विकल्प हैं:

  • 1 और enumerate() साथ 2 सूचियों को सजाने, तो इन सूचकांक का उपयोग कर 3 सूची से मूल्यों का उल्लेख करने को सॉर्ट :

    cat_sorted = [ 
        [e for i, e in sorted(enumerate(cat[0]), key=lambda p: cat[2][p[0]])], 
        [e for i, e in sorted(enumerate(cat[1]), key=lambda p: cat[2][p[0]])], 
        sorted(cat[2]) 
    ] 
    

    हालांकि यह cat[2] सॉर्ट करने के लिए मदद मिल सकती है यथा-स्थान के बजाय sorted() का उपयोग करने का; आप अन्य दो के लिए sorted() का उपयोग नहीं कर सकते हैं।

  • zip() तीन सूचियों को एक साथ, तो तरह सूचियों के इस नए सूची के तीसरे तत्व पर है, तो zip() फिर से वापस मूल संरचना को पाने के लिए:

    from operator import itemgetter 
    cat_sorted = zip(*sorted(zip(*cat), key=itemgetter(2))) 
    

न तो एक प्रदर्शन किया जाएगा बस्टर, लाखों संख्याओं की सादे पायथन सूचियों के साथ नहीं।

+0

यह एक अच्छा समाधान है! –

+0

एक बार जब मुझे पता चला कि ओपी का क्या मतलब था और नमूना इनपुट और आउटपुट से कैसे वर्णन किया गया, तो मेरा दिमाग तुरंत आपके द्वारा दिखाए गए 'ज़िप' दृष्टिकोण पर कूद गया। दिए गए समस्या विवरण से पता चलता है कि डेटा वास्तव में शुरू करने के लिए सही ढंग से व्यवस्थित नहीं है; उस सुंदरता के चारों ओर 'ज़िप' हैक्स। –

+0

शानदार। ज़िप कमांड के साथ दूसरा समाधान पूरी तरह से काम करता है। सहायता के लिए धन्यवाद! :) – Shanagar

4

यदि आप अतिरिक्त लाइब्रेरी का उपयोग करने के इच्छुक हैं, तो मैं Python Pandas का सुझाव देता हूं। इसमें डेटाफ्रेम ऑब्जेक्ट R के data.frame जैसा है और कन्स्ट्रक्टर में सूचियों की एक सूची स्वीकार करता है, जो 3-कॉलम डेटा सरणी बनाएगा। फिर आप तीसरे कॉलम (आरोही या अवरोही) द्वारा क्रमबद्ध करने के लिए अंतर्निहित pandas.DataFrame.sort फ़ंक्शन का आसानी से उपयोग कर सकते हैं।

ऐसा करने के लिए कई सादे पायथन तरीके हैं, लेकिन आपकी समस्या का आकार दिया गया है, पांडस में अनुकूलित कार्यों का उपयोग करना एक बेहतर तरीका है। और यदि आपको अपने सॉर्ट किए गए डेटा से किसी भी प्रकार के समेकित आंकड़ों की आवश्यकता है, तो पांडस इसके लिए कोई ब्रेनर नहीं है।

+0

पांडों का उपयोग करने के लिए +1 - यही वह है जो मैं लिखने की प्रक्रिया में था। अन्य उत्तरों सही हैं लेकिन ऐसे बड़े डेटा के लिए पांडस जैसी लाइब्रेरी सेट है जो आप वास्तव में चाहते हैं। – Iguananaut

2

सामान्य दृष्टिकोण जो मैं लेता हूं वह पूरी चीज पर schwartzian transform करना था।

तीन सूचियों को एक साथ tuples की सूची में ज़िप करें।

कुंजी के रूप में तीसरे तत्व का उपयोग कर tuples को सॉर्ट करें।

tuples की नई क्रमबद्ध सूची में पुनरावृत्त करें और फिर तीन सूचियों को भरें।

1

पूरा होने के लिए, एक समाधान numpy का उपयोग कर:

import numpy as np 

cat = [[152.123, 150.456, 151.789], 
     [4.123, 3.456, 1.789], 
     [20.123, 22.456, 21.789]] 

cat = np.array(cat) 
cat_sorted = cat[:, cat[2].argsort()] 

print cat_sorted 
[[ 152.123 151.789 150.456] 
[ 4.123 1.789 3.456] 
[ 20.123 21.789 22.456]] 
0

यहाँ एक और तरीका करना है मार्टिन पीटर्स द्वारा महान जवाब और pcalcao

def sort_by_last(ll): 
    """ 
     >>> sort_by_last([[10, 20, 30], [3, 2, 1]]) 
     [[30, 20, 10], [1, 2, 3]] 

     >>> sort_by_last([[10, 20, 30], [40, 50, 60], [3, 2, 1]]) 
     [[30, 20, 10], [60, 50, 40], [1, 2, 3]] 

     >>> sort_by_last([[10, 20, 30], [40, 50, 60], [1, 1, 1]]) 
     [[10, 20, 30], [40, 50, 60], [1, 1, 1]] 

     >>> sort_by_last([[10, 20, 30], [40, 50, 60], [1, 3, 1]]) 
     [[10, 30, 20], [40, 60, 50], [1, 1, 3]] 

     >>> sort_by_last([[152.123, 150.456, 151.789], [4.123, 3.456, 1.789], [20.123, 22.456, 21.789]]) 
     [[152.123, 151.789, 150.456], [4.123, 1.789, 3.456], [20.123, 21.789, 22.456]] 
    """ 
    return [sorted(x, key=lambda y: ll[-1][x.index(y)]) for x in ll] 

बड़ा स्ट्रिंग वहाँ के आधार पर यह फ़ंक्शन का परीक्षण करने के लिए इसे एक फ़ाइल में कॉपी करें और इसे python -m doctest -v <file>

+0

यहां स्टिंग 'x.index()' है जो बड़ी सूचियों के लिए सॉर्ट को धीमा कर देगा –

0

यहां, keys सूचकांक की एक क्रमबद्ध सूची है।

keys = sorted(range(len(cat[2])), key=cat[2].__getitem__) 
cat_sorted = [[cat[i][k] for k in keys] for i in range(3)] 
संबंधित मुद्दे