2012-06-01 14 views
5

दरअसल, मेरे पास "मीटिंग" के बारे में डेटासेट है। उदाहरण के लिए, ए, बी, सी में एक बैठक है, तो सूची [ए, बी, सी] होगी। इस तरह, प्रत्येक सूची में सदस्यों की एक सूची होगी जो बैठक में भाग लेते थे। इसलिए:पायथन: सूचियों की सूची में तत्वों के जोड़े की आवृत्ति की गणना

पंक्ति 1 = (ए, बी, सी)

पंक्ति 2 = (ए, सी, डी, ई)

पंक्ति 3 = (डी, एफ, जी)

..

मैं सिर्फ संख्या की गणना करना चाहता हूं कि सदस्यों की प्रत्येक जोड़ी एक-दूसरे से मिलती है। उदाहरण के लिए, सदस्य ए लाइन 1 और लाइन 2 से दो बार सी मिलता है और सदस्य बी लाइन 1 से सी एक बार मिलता है। तो, मैं इस तरह एक चार्ट बनाने के लिए चाहते हैं ..

A B C D E F G... 

A . 1 2 1 ... 

B 1 . 1 0 

C 

...

मैंने सोचा कि यह पहली बार में आसान होगा लेकिन मैं बहुत उलझन में हूँ। कृपया मेरी मदद करें और अग्रिम में बहुत बहुत धन्यवाद।

+1

मैट्रिक्स को गुणा करने के तरीके सीखने का समय ... –

उत्तर

0

यह 2 डी सरणी या dict के साथ एक बहुत ही सरल डेटा-संरचना समस्या है। यदि आपके पास बहुत से लोग हैं, तो Arrays अधिक कुशल हैं, लेकिन मैं मानता हूं कि आप नहीं करते हैं।

times_met = defaultdict(int) 
for line in lines: 
    for pair in itertools.combinations(line, 2) 
     times_met[pair] += 1 

# How many times person a meets person b is described by the following (s.t. a < b) 
print times_met[(a, b)] 

नोट अगर आप विशाल मीटिंग नहीं है और अधिक कुशल एल्गोरिदम शायद मौजूद है कि यह वास्तव में अक्षम है।

+1

मुझे लगता है कि टुपल का एक निर्देश -> int अधिक समझ में आता है - ताकि 'people_met [(person1, person2)]' उनके बीच बैठकें हो। फिर इसे 'डिफॉल्टडिक्ट' होने की आवश्यकता नहीं है - शुरुआत में इसे 'itertools.combinations' से प्रारंभ करें। – lvc

+0

@lvc ए 'डिफॉल्टडिक्ट (int)' अर्थपूर्ण रूप से अधिक समझ में आता है। यदि कोई नया व्यक्ति डेटासेट में शामिल होता है, तो आप पूछ सकते हैं कि वह किसी और के साथ बैठक में कितनी बार रहा है और 'KeyError' के बजाय सही उत्तर - 0 प्राप्त करें। शून्य के साथ भी प्रारंभ करना बहुत ही पायथनिक है। आपने कभी 'डिफॉल्टडिक्ट' _need_ नहीं किया है लेकिन यह आपको बेहतर कोड लिखने की अनुमति देता है। – agf

+0

संपादन अच्छा है, लेकिन यह अभी भी बड़े डेटासेट के लिए अक्षम है क्योंकि आप केवल संयोजनों के बजाय लाइन के कार्टेशियन उत्पाद को उत्पन्न करते हैं। याद रखें कि पाइथन बैटरी शामिल है - ऐसा करने का पहले से ही एक तरीका है। – agf

0

ऐसा लगता है कि आप इसे मैट्रिक्स अतिरिक्त के साथ हल करने में सक्षम होना चाहिए। यदि आप लोगों की कुल संख्या (प्रश्न में जी) जानते हैं, तो आपका उत्तर एक जीएक्सजी मैट्रिक्स होने जा रहा है। पंक्ति 1 से संयोजनों के साथ एक GXG मैट्रिक्स बनाएं, फिर पंक्ति 2 से संयोजनों के साथ एक GXG मैट्रिक्स में, आदि

7

बल्कि मैन्युअल संक्षेप आवृत्तियों से जोड़ने के लिए, itertools के साथ collections.counter का उपयोग करें:

from collections import Counter 
from itertools import chain, combinations 

meets = Counter(chain.from_iterable(combinations(line, 2) for line in lines)) 

lines कहां है नामों के पुनरावृत्तियों का एक पुनरावृत्त।

+0

+1। सब कुछ कहीं पर है। >: पी –

+0

एक समाधान के लिए +1 इतनी अंधेरे से स्पष्ट रूप से मैं अपने जवाब तक इसे ध्यान में रखते हुए खुद को लात मार रहा हूं।जब दूसरा उत्तर 'डिफॉल्टडिक्ट (int)' का उपयोग करता है और 'd [item] + = 1' बहुत कुछ करता है, तो वह 'काउंटर' के लिए चिल्ला रहा है। इस सवाल का जिक्र नहीं है कि "मैं गिनना चाहता हूं ..."। – lvc

+1

ध्यान दें कि यह केवल तभी काम करेगा यदि तत्व प्रत्येक सूची में एक ही क्रम में हैं, उदा। 'काउंटर (chain.from_iterable (x ([1,2], [2,1]] में x के लिए संयोजन (x, 2)))' काउंटर ({(1, 2): 1, (2, 1) उत्पन्न करता है : 1}) '। यदि आप ऑर्डर के बावजूद प्रत्येक जोड़ी को गिनना चाहते हैं, तो प्रत्येक सूची को पहले सेट में बदलें: 'काउंटर (chain.from_iterable (x (x, 2) x में सेट ([1,2]), सेट ([2, 1])])) 'काउंटर उत्पन्न करता है ({(1, 2): 2})'। – Katrina

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