पायथन सूची समझ: क्या एक समय में दो तत्वों को शामिल करना संभव है? - अजगर, सूची-समझ

समय पर इस बिंदु तक, पायथन में, मैंने कभी सूची सूची को देखा है जो समय पर एक तत्व को शामिल करने का निर्दिष्ट करता है। उदाहरण के लिए, वे सभी निम्नलिखित रूप में हैं

[f(x) for x in <iterable>]

क्या एक समय में एक से अधिक तत्व निर्दिष्ट करने का कोई तरीका है? उदाहरण के लिए,

[f(x), g(x) for x in <iterable>]

मैं पूछ रहा हूं क्योंकि मैं एक सूची समझ बनाना चाहता हूं जो कुछ संख्या x के सभी divisors की गणना करता है, लेकिन मैं इसे यथासंभव कुशलतापूर्वक करना चाहता हूं। अभी मैं निम्नलिखित का उपयोग कर रहा हूं,

[y for y in range(1,x+1) if x%y == 0]

लेकिन मैं ऐसा कुछ करना चाहता हूं,

[y, x/y for y in range(1, sqrt(x)+1) if x%y == 0]

क्योंकि यह अधिक कुशल होगा।बीटीडब्ल्यू, मेरे पास ऐसा करने का कोई व्यावहारिक कारण नहीं है। यह केवल एक चुनौती समस्या है जिसे किसी ने मुझे बताया और लक्ष्य इसे सबसे छोटी, सबसे कुशल सूची समझ के साथ करना है।

अग्रिम में धन्यवाद।

संपादित करें: ठीक है, ऐसा लगता है कि मुझे tuples का उपयोग करना है। मैं इससे बचने की कोशिश कर रहा था कि यद्यपि मुझे "सूची को फ़्लैट करने के लिए एक और कार्य करना है जो मेरा समाधान अधिक लंबा कर देगा।

2 संपादित करें: अगर किसी को इस सवाल पर ठोकर खाई जाती है, तो मैं अपने मूल प्रश्न में जो करना चाहता हूं उसका उत्तर यह है:

[y for x in <iterable> for y in f(x), g(x)]

यह काम पूरा करने के लिए सूची समझ में लूप के लिए घोंसला का उपयोग करता है।

उत्तर:

जवाब के लिए 3 № 1

आप tuples को असाइन कर सकते हैं

[(y, x/y) for y in range(1, int(sqrt(x))+1) if x%y == 0]

वास्तव में आपके मूल प्रश्न से संबंधित नहीं है, लेकिन आपका उदाहरण: मुझे दूसरे पैरामीटर को परिवर्तित करना पड़ा range() एक को int जबसे sqrt() परिणामस्वरूप ए float मेरे टेस्ट कोड में।

अद्यतन करें फिर से संपादित करें पोस्ट में:

Tuples की इस सूची को फ़्लैट करने के लिए:

In [24]: s
Out[24]: [(1, 20), (2, 10), (4, 5)]

इसे इस्तेमाल करो:

In [25]: import operator

एक ट्यूपल बनाएं:

In [26]: reduce(operator.add, s, ())
Out[26]: (1, 20, 2, 10, 4, 5)

एक सूची बनाएं:

In [27]: list(reduce(operator.add, s, ()))
Out[27]: [1, 20, 2, 10, 4, 5]

ध्यान दें: एक सहायक टिप्पणी में @ jamylak बताते हैं कि reduce तथा operator.add रन ऑर्डर ओ (एन ^ 2), और इसका उपयोग करना itertools.chain अधिक कुशल होगा। यह अधिक महत्वपूर्ण हो जाता है क्योंकि सूची का आकार बढ़ता है और उस मामले में विचार किया जाना चाहिए।


जवाब के लिए 4 № 2

आप इसे जगह में फटकार सकते हैं

[y if i else x/y for y in range(1, sqrt(x)+1) for i in 0,1 if x%y == 0]

जवाब के लिए 3 № 3

हां तुम यह कर सकते हो। आपको केवल तत्व के चारों ओर कोष्ठक रखना होगा। आपको जो मिलते हैं वह टुपल्स की एक सूची है।

>>> [(x, x+1) for x in range(5)]
[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]

जवाब के लिए 2 № 4

ओह बहुत करीब:

[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]

टुपल्स की एक सूची उत्पन्न करना संभव है, और निश्चित रूप से ये कई मान रख सकते हैं।


उत्तर के लिए 1 № 5

हाँ बिल्कुल, मूल्य के चारों ओर केवल ब्रांड्स का उपयोग करें:

[(y, x/y) for y in range(1, sqrt(x)+1) if x%y == 0]

संबंधित सवाल
सबसे लोकप्रिय