एक सरणी में पायथन वस्तुओं की विशेषता से मेल खाने के लिए 'इन' का उपयोग करना

मुझे याद नहीं है कि मैं सपना देख रहा था या नहीं, लेकिन मुझे याद है कि ऐसा एक समारोह है जिसने कुछ ऐसा करने की इजाजत दी है,

foo in iter_attr(array of python objects, attribute name)

मैंने दस्तावेज़ों को देखा है लेकिन इस तरह की चीज किसी भी स्पष्ट सूचीबद्ध शीर्षलेख के अंतर्गत नहीं आती है

0
जोड़ा संपादित
विचारों: 1

10 उत्तर

एक फीचर लिखने तक, मैंने बताया है कि इवेंट रिसीवर के साथ ऐसा कैसे करें यहां

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

अनुमति स्तर को एपीआई में भूमिका कहा जाता है। आप एक नया SPRoleDefinition बनाना चाहते हैं, कॉन्फ़िगर करें नाम और आधार पैरामिशन, और उसके बाद इसे SPWeb.RoleDefinitions संग्रह में जोड़ें।

समूह को एपीआई में समूह कहा जाता है। आप एक समूह बनाने के लिए SPWeb.Groups.Add को कॉल करना चाहते हैं।

मुझे उम्मीद है कि यह सब समझ में आता है।

1
जोड़ा

जो मैं सोच रहा था वह सूची समझों का उपयोग करके हासिल किया जा सकता है, लेकिन मैंने सोचा कि एक ऐसा कार्य था जिसने इसे थोड़ा साफ तरीके से किया था।

यानी 'बार' ऑब्जेक्ट्स की एक सूची है, जिनमें से सभी में 'आईडी' विशेषता है

पौराणिक कार्यात्मक तरीका:

foo = 12
foo in iter_attr(bar, 'id')

सूची समझ तरीका:

foo = 12
foo in [obj.id for obj in bar]

पूर्व-निरीक्षण में सूची समझने का तरीका वैसे भी काफी साफ है।

0
जोड़ा

नहीं, आप सपने देख रहे थे। पायथन में एक बहुत ही उत्कृष्ट सूची समझ प्रणाली है जो आपको सुन्दरता से सुंदरता में हेरफेर करने देती है, और जो कुछ आप पूरा करना चाहते हैं उसके आधार पर, इसे दो तरीकों से किया जा सकता है। संक्षेप में, आप जो कर रहे हैं वह कह रहा है "मानदंडों के लिए सूची में आइटम के लिए", और उससे आप केवल परिणामों के माध्यम से पुन: प्रयास कर सकते हैं या परिणामों को एक नई सूची में डंप कर सकते हैं।

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

  files = os.listdir (पथ)
    test = re.compile ("test \ .py $", re.IGNORECASE)
    फ़ाइलें = [f में फ़ाइलों के लिए एफ अगर test.search (एफ)]
 

आप नियमित अभिव्यक्ति के बिना ऐसा कर सकते हैं, उदाहरण के लिए, किसी भी चीज़ के लिए जहां अंत में आपकी अभिव्यक्ति एक मैच के लिए सच होती है। फ़िल्टर() फ़ंक्शन का उपयोग करने जैसे अन्य विकल्प हैं, लेकिन अगर मैं चुनने जा रहा हूं, तो मैं इसके साथ जाऊंगा।

एरिक सिपल

0
जोड़ा

मुझे लगता है:

#!/bin/python
bar in dict(Foo)

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

यह आपके प्रश्न का उत्तर देना चाहिए।

और अब इसे पहले से दिए गए सूची समझ उत्तर में जोड़ने के लिए थोड़ा सा विषय (थोड़ी अधिक स्पष्टता के लिए)। सूची समझें संशोधक के साथ मूल लूप से एक सूची बनाएं। एक उदाहरण के रूप में (थोड़ा स्पष्ट करने के लिए), dict# / code> भाषा का उपयोग करने का एक तरीका सूची समझ में बना है:

मान लें कि आपके पास दो आयामी शब्दकोश foo है और आप केवल दूसरे आयाम शब्दकोश चाहते हैं जिसमें कुंजी bar हो। ऐसा करने का एक अपेक्षाकृत सरल तरीका निम्नानुसार एक सशर्त के साथ सूची समझ का उपयोग करना होगा:

#!/bin/python
baz = dict([(key, value) for key, value in foo if bar in value])

कथन ** के अंत में मान में बार पर ध्यान दें, यह एक संशोधित खंड है जो सूची समझ को केवल उन लोगों को रखने के लिए कहता है कुंजी-मूल्य जोड़े जो सशर्त को पूरा करते हैं। ** इस मामले में baz एक नया शब्दकोश है जिसमें केवल foo के शब्दकोश शामिल हैं जिनमें बार शामिल है (उम्मीद है कि मुझे याद नहीं आया उस कोड उदाहरण में कुछ भी ... आपको docs.python.org ट्यूटोरियल और secnetix.de , यदि भविष्य में आपके कोई प्रश्न हैं तो दोनों साइटें अच्छे संदर्भ हैं।)।

0
जोड़ा

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

यदि यह आवश्यक रूप से प्रदर्शन संवेदनशील कोड नहीं है, तो सूची समझने का तरीका काम करना चाहिए। लेकिन ध्यान दें कि यह काफी अक्षम है क्योंकि यह इटेटरेटर के हर तत्व पर चला जाता है और फिर इसे तब तक वापस चला जाता है जब तक वह यह नहीं चाहता कि वह क्या चाहता है।

याद रखें, पाइथन में सबसे कुशल हैशिंग एल्गोरिदम में से एक है। अपने लाभ के लिए इसका इस्तेमाल करें।

0
जोड़ा

जिस फ़ंक्शन के बारे में आप सोच रहे हैं वह शायद operator.attrgettter है। उदाहरण के लिए, एक सूची प्राप्त करने के लिए जिसमें प्रत्येक ऑब्जेक्ट की "आईडी" विशेषता का मान शामिल है:

import operator
ids = map(operator.attrgetter("id"), bar)

यदि आप यह जांचना चाहते हैं कि सूची में एक आईडी == 12 वाला ऑब्जेक्ट है, तो एक साफ और कुशल (यानी पूरी सूची को अनावश्यक रूप से पुन: सक्रिय नहीं करता है) ऐसा करने का तरीका है:

any(obj.id == 12 for obj in bar)

यदि आप एट्राजेटर के साथ 'इन' का उपयोग करना चाहते हैं, तब भी सूची के आलसी पुनरावृत्ति को बनाए रखना:

import operator,itertools
foo = 12
foo in itertools.imap(operator.attrgetter("id"), bar)
0
जोड़ा

एक सूची समझ का उपयोग एक अस्थायी सूची का निर्माण करेगा, जो अनुक्रम की खोज की जा रही है, तो आपकी सभी याददाश्त खा सकती है। यहां तक ​​कि यदि अनुक्रम बड़ा नहीं है, तो सूची बनाने का अर्थ है में अपनी खोज शुरू करने से पहले पूरे अनुक्रम पर पुनरावृत्ति करना।

जनरेटर अभिव्यक्ति का उपयोग करके अस्थायी सूची से परहेज किया जा सकता है:

foo = 12
foo in (obj.id for obj in bar)

अब, obj.id == 12 bar की शुरुआत के करीब तक, खोज तेज होगी, भले ही bar असीमित रूप से लंबा हो ।

जैसा कि @ मैट ने सुझाव दिया है, hasattr का उपयोग करना एक अच्छा विचार है यदि bar में से किसी भी ऑब्जेक्ट में id विशेषता अनुपलब्ध हो सकती है:

foo = 12
foo in (obj.id for obj in bar if hasattr(obj, 'id'))
0
जोड़ा

क्या आप उन ऑब्जेक्ट्स की एक सूची प्राप्त करना चाहते हैं जिनके पास एक निश्चित विशेषता है? यदि ऐसा है, तो ऐसा करने के लिए एक सूची समझ सही तरीका है।

result = [obj for obj in listOfObjs if hasattr(obj, 'attributeName')]
0
जोड़ा

आप हमेशा एक लिख सकते हैं:

def iterattr(iterator, attributename):
    for obj in iterator:
        yield getattr(obj, attributename)

जो कुछ भी पुनरावृत्त होता है, उसके साथ काम करेगा, चाहे वह एक टुपल, सूची हो या जो भी हो।

मुझे अजगर से प्यार है, यह इस तरह की चीजें बहुत आसान बनाता है और इससे पहले की तुलना में परेशानी नहीं होती है, और इस तरह की सामग्री में बहुत ही सुरुचिपूर्ण है।

0
जोड़ा