2017-09-12 7 views
5

की मैं इस सरल सरणी है लगता है:सरणी हेरफेर

simple_list = [  
    ('1', 'a', 'aa'),  
    ('2', 'b', 'bb'),  
    ('3', 'c', 'cc') 
] 

अगर हम एक मेज, जहां कॉलम comas और लाइनों tuples द्वारा अलग से अलग होते हैं के रूप में इस सूची पर विचार, मैं एक समारोह का निर्माण करना चाहते है कि केवल वही कॉलम प्राप्त करता है जो मैं चाहता हूं।

get_columns(array, tuple_columns_selector)) 

मैं चाहता हूँ, उदाहरण के लिए, इसे से बाहर केवल पहले और तीसरे स्तंभ इकट्ठा करने के लिए, इस मामले में, यह मुझे एक और सरणी नए के साथ वापसी होगी: उदाहरण के लिए, इस समारोह कुछ इस तरह दिखाई देगा मान:

अगर मैं कार्य करें:

get_columns(simple_list, (0,2))  
get_columns(simple_list, (0,)) 
कुछ

यह वापस आ जाएगी की तरह:

[('1', 'aa'), ('2', 'bb'), ('1', 'cc')]  
[1, 2, 3] 

और इसी तरह। क्या आप इस get_columns फ़ंक्शन को बनाने में मेरी सहायता कर सकते हैं, कृपया? यहाँ कोड मैंने कोशिश की है या नहीं:

def get_columns(arr, columns): 
    result_list = [] 
    for ii in arr: 
     for i in columns: 
      result_list.append(ii[i]) 
    return result_list 


to_do_list = [ 
    ('Wake Up', True), 
    ('Brush Teeh', True), 
    ('Go to work', True), 
    ('Take a shower', True), 
    ('Go to bed', False) 
] 

print(get_columns(to_do_list, (0,))) 
+3

यदि आप मुझे अपना दिखाते हैं तो मैं आपको अपना कोड दिखाता हूं :-) यदि यह गलत है, तो बस दिखाएं कि आपने क्या प्रयास किया है। हम इसे ठीक करने में आपकी मदद कर सकते हैं। –

+0

स्टैक ओवरव्लो में आपका स्वागत है। कृपया पढ़ें [कैसे पूछें] (https://stackoverflow.com/help/how-to-ask), और आपने जो कोशिश की है उसका विवरण शामिल करें, विशेष रूप से, हमें कुछ कोड दिखाएं जिन्हें आपने लिखने की कोशिश की हो। – Antimony

+0

ये सरणी नहीं हैं। लेकिन वास्तव में, यह वास्तविक सरणी * के लिए एक महान उपयोग-मामले * की तरह लगता है *, विशेष रूप से, संरचित 'numpy.array's –

उत्तर

4

operator.itemgetter और map के जादू का उपयोग करें:

from operator import itemgetter 

simple_list = [ 
    ('1', 'a', 'aa'), 
    ('2', 'b', 'bb'), 
    ('3', 'c', 'cc') 
] 

cols = (1,) # can be (0, 2) 
fn = itemgetter(*cols) 
print map(fn, simple_list) 

रिटर्न:

[('1', 'aa'), ('2', 'bb'), ('3', 'cc')] 

जब cols(0, 2) है।

और यह देता है:

[1,2,3] 

जब cols(1,) है।

तो अपने get_columns समारोह

def get_columns(data, cols): 
    return map(itemgetter(*cols), data) 
+0

आह, बहुत अच्छा समाधान, जो मैं मूल रूप से सोच रहा था उससे काफी बेहतर था। यह ओपी के तत्वों को एकल तत्वों या तत्वों के झुकाव को बहुत सुंदर तरीके से प्राप्त करने का तर्क देता है। –

+0

चीयर्स, मैं प्रोग्रामिंग के लिए नया हूं, मैं मॉड्यूल से बहुत परिचित नहीं हूं लेकिन यह इसे हल करने का एक बहुत ही दिलचस्प तरीका है। एक बार फिर से धन्यवाद। –

+0

यह अच्छा लग रहा है! मुझे कुछ नया सिखाने के लिए धन्यवाद। – Basya

2

@kopos का जवाब ठीक लग रहा है हो सकता है, मैं सिर्फ अतिरिक्त लाइब्रेरी के बिना एक साझा करना चाहते थे।

simple_list = [ 
    ('1', 'a', 'aa'), 
    ('2', 'b', 'bb'), 
    ('3', 'c', 'cc') 
] 

def get_columns(array, tuple_columns_selector): 
    return [tuple(elem[i] for i in tuple_columns_selector) for elem in array] 

def get_columns_multiple_lines(array, tuple_columns_selector): 
    # The only difference between the result of this version and the other is that this one returns a list of lists 
    # while the other returns a list of tuples 
    resulting_list = [] # Create the variable that will store the resulting list 
    for elem in array: # Loop for each element in array 
     resulting_list.append([]) # We add a new "empty row" to store all the columns needed 
     for i in tuple_columns_selector: # Loop for each column needed 
      resulting_list[-1].append(elem[i]) # We append the column value to the last item in resulting_list 
    return resulting_list 


print get_columns(simple_list, (0,2)) # outputs [('1', 'aa'), ('2', 'bb'), ('3', 'cc')] 
print get_columns(simple_list, (0,)) # outputs [('1',), ('2',), ('3',)] 
print get_columns_multiple_lines(simple_list, (0,2)) # outputs [['1', 'aa'], ['2', 'bb'], ['3', 'cc']] 

केवल अंतर ही वापसी मूल्य है जब tuple_columns_selector केवल एक कॉलम होता है। यदि यह एक महत्वपूर्ण अंतर है, तो मैं इसे "सही" कर सकता हूं, लेकिन आपको इस बारे में सोचना चाहिए कि उस मूल्य का उपयोग कैसे किया जाएगा और यदि इसके लिए विभिन्न संभावित संरचनाएं सुविधाजनक हैं।

+0

धन्यवाद एक मिल, आपने वही किया जो मैं चाहता था। यह मेरे लिए थोड़ा उलझन में है, हालांकि यह एक के लिए रेखांकित है। मैंने अभी तक इसका उपयोग नहीं किया है, लेकिन मैं निश्चित रूप से करूँगा। नहीं, (1,) से 1 को बदलने की जरूरत नहीं है। यह ठीक है। –

+0

मैंने एक और सरल जोड़ा, एक लाइन दृष्टिकोण नहीं। –

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