एक फ्लैट सूची या एक मैट्रिक्स में "ट्यूपल्स की सूची" बदलें


82

Sqlite के साथ, एक "select..from" कमांड परिणाम "आउटपुट" देता है, जो प्रिंट करता है (अजगर में):

>>print output
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]

यह ट्यूपल्स की एक सूची प्रतीत होती है। मैं या तो "आउटपुट" को एक साधारण 1D सरणी में बदलना चाहता हूं (= पायथन में सूची मुझे लगता है):

[12.2817, 12.2817, 0, 0, 8.52, 8.52]

या एक 2x3 मैट्रिक्स:

12.2817 12.2817
0          0 
8.52     8.52

"आउटपुट [i] [j] के माध्यम से पढ़ने के लिए

सपाट कमांड 1 विकल्प के लिए काम नहीं करता है, और मुझे दूसरे के लिए कोई विचार नहीं है ... :)

क्या आप मुझे संकेत दे सकते हैं? कुछ चीजें तेजी से महान होंगी क्योंकि असली डेटा बहुत बड़ा है (यहां सिर्फ एक सरल उदाहरण है)।


2
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]पहले से ही एक 3x2 मैट्रिक्स है?! या किसी को याद किया था ?
मौद


1
समतल समारोह के लिए चेक itertools व्यंजनों मॉड्यूल वहाँ पहले से ही है एक समतल समारोह उदाहरण: docs.python.org/library/itertools.html#recipes
mouad

4
[item for sublist in output for item in sublist]पूरी तरह से काम करता है और इसका फायदा है कि आपके भीतर के ट्यूल भी सूचीबद्ध हो सकते हैं; आम तौर पर आंतरिक और बाहरी चलने योग्य कार्यों के किसी भी संयोजन
Kyss ताओ

जवाबों:


125

अब तक का सबसे तेज़ (और सबसे छोटा) समाधान पोस्ट किया गया:

list(sum(output, ()))

itertoolsसमाधान की तुलना में लगभग 50% तेज , और समाधान की तुलना में लगभग 70% तेज map


8
@ अच्छा, लेकिन मुझे आश्चर्य है कि यह कैसे काम करता है? list(output[0]+output[1]+output[2])वांछित परिणाम देता है लेकिन list(sum(output))नहीं। क्यों? "जादू" क्या करता है ()?
कीस ताओ

9
ठीक है, मुझे मैनुअल जी पढ़ना चाहिए । ऐसा लगता है sum(sequence[, start]): योग जोड़ता है startकि कौन सी चूक के 0बजाय फिर से शुरू होता है sequence[0]अगर यह मौजूद है और फिर बाकी तत्वों को जोड़ रहा है। आपको परेशान किया उसके लिए क्षमा करें।
कीस ताओ

3
यह एक जाना-माना एंटी-पैटर्न है: sumसीक्वेंस को अलग करने के लिए इस्तेमाल नहीं करते हैं , इसका परिणाम द्विघात समय एल्गोरिथ्म में होता है। वास्तव में, sumयदि आप स्ट्रिंग्स के साथ ऐसा करने की कोशिश करते हैं , तो फ़ंक्शन शिकायत करेगा!
juanpa.arrivillaga

@ juanpa.arrivillaga: सहमत। ऐसे बहुत कम उपयोग मामले हैं जहां यह बेहतर होगा।
जोएल कॉर्नेट

9
हां, तेज लेकिन पूरी तरह से आज्ञाकारी। आपको एक टिप्पणी छोड़नी होगी कि यह वास्तव में क्या कर रहा है :(
CpILL

42

सूची समझ दृष्टिकोण जो Iterable प्रकार के साथ काम करता है और यहां दिखाए गए अन्य तरीकों से तेज है।

flattened = [item for sublist in l for item in sublist]

lसमतल करने के लिए सूची है ( outputओपी के मामले में कहा जाता है)


समय परीक्षण:

l = list(zip(range(99), range(99)))  # list of tuples to flatten

सूची की समझ

[item for sublist in l for item in sublist]

समय परिणाम = 7.67 ±s result 129 ns प्रति लूप

सूची विस्तार () विधि

flattened = []
list(flattened.extend(item) for item in l)

timeit परिणाम = 11 µs result 433 ns प्रति लूप

योग ()

list(sum(l, ()))

timeit परिणाम = 24.2 ±s result 269 ns प्रति लूप


1
मुझे एक बड़े डेटासेट पर इसका उपयोग करना पड़ा, सूची समझने की विधि अब तक सबसे तेज़ थी!
नबूकट

मैंने .extend समाधान में थोड़ा बदलाव किया और अब थोड़ा बेहतर प्रदर्शन करता है। तुलना करने के लिए अपने समय पर इसकी जाँच करें
Totoro

24

पायथन 2.7, और पायथन 3 के सभी संस्करणों में, आप itertools.chainपुनरावृत्तियों की एक सूची को समतल करने के लिए उपयोग कर सकते हैं । या तो *वाक्य रचना या वर्ग विधि के साथ।

>>> t = [ (1,2), (3,4), (5,6) ]
>>> t
[(1, 2), (3, 4), (5, 6)]
>>> import itertools
>>> list(itertools.chain(*t))
[1, 2, 3, 4, 5, 6]
>>> list(itertools.chain.from_iterable(t))
[1, 2, 3, 4, 5, 6]

11

अद्यतन : विस्तार का उपयोग किए बिना समतल लेकिन बिना समझ के और सूची के रूप में उपयोग किए बिना (सबसे तेज़)

इसके बाद अगले उत्तर की जाँच करने के बाद, जो कि dual forमैंने थोड़ा ट्वीक किया था, और अब बेहतर प्रदर्शन करता है, सूची के माध्यम से तेजी से समाधान प्रदान किया है, पहले सूची का निष्पादन (...) समय का एक बड़ा प्रतिशत खींच रहा था, फिर एक सूची बदल रहा है एक साधारण लूप के लिए समझ थोड़ी और अधिक मुंडा।

नया समाधान है:

l = []
for row in output: l.extend(row)

पुराना:

नक्शा / विस्तार के साथ चपटा:

l = []
list(map(l.extend, output))

नक्शे के बजाय सूची की समझ के साथ चपटा होना

l = []
list(l.extend(row) for row in output)

नए विस्तार के लिए कुछ समय और सुधार केवल [...] के लिए सूची (...) को हटाकर:

import timeit
t = timeit.timeit
o = "output=list(zip(range(1000000000), range(10000000))); l=[]"
steps_ext = "for row in output: l.extend(row)"
steps_ext_old = "list(l.extend(row) for row in output)"
steps_ext_remove_list = "[l.extend(row) for row in output]"
steps_com = "[item for sublist in output for item in sublist]"

print("new extend:      ", t(steps_ext, setup=o, number=10))
print("old extend w []: ", t(steps_ext_remove_list, setup=o, number=10))
print("comprehension:   ", t(steps_com, setup=o, number=10,))
print("old extend:      ", t(steps_ext_old, setup=o, number=10))

>>> new extend:       4.502427191007882
>>> old extend w []:  5.281140706967562
>>> comprehension:    5.54302118299529
>>> old extend:       6.840151469223201    


7
>>> flat_list = []
>>> nested_list = [(1, 2, 4), (0, 9)]
>>> for a_tuple in nested_list:
...     flat_list.extend(list(a_tuple))
... 
>>> flat_list
[1, 2, 4, 0, 9]
>>> 

आप आसानी से ऊपर दिखाए गए अनुसार टपल की सूची से एकल सूची में जा सकते हैं।


7

या आप इस तरह सूची को समतल कर सकते हैं:

reduce(lambda x,y:x+y, map(list, output))

reduce(lambda x,y:x+y, output)लगता है कि सीधे एक लंबे टपल को परिवर्तित करने के लिए काम करता है (जिसे एक सूची में परिवर्तित किया जा सकता है)। कॉल के map(list, output)अंदर उपयोग क्यों reduce()करें? शायद यह इस तथ्य के अनुरूप अधिक है कि ट्यूप्स अपरिवर्तनीय हैं, सूचियां परस्पर हैं
पॉल रौजीक्स

5

यह वह है जो numpyदोनों के लिए एक डेटा संरचनाओं से बनाया गया था, साथ ही साथ गति परिप्रेक्ष्य भी।

import numpy as np

output = [(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
output_ary = np.array(output)   # this is your matrix 
output_vec = output_ary.ravel() # this is your 1d-array

2

मनमानी नेस्टेड सूचियों के मामले में (बस मामले में):

def flatten(lst):
    result = []
    for element in lst: 
        if hasattr(element, '__iter__'):
            result.extend(flatten(element))
        else:
            result.append(element)
    return result

>>> flatten(output)
[12.2817, 12.2817, 0, 0, 8.52, 8.52]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.