2012-08-01 15 views
22

क्या अन्य सूची में उनके पत्राचार को तोड़ने के बिना दो संबंधित सूचियों को यादृच्छिक रूप से घुमाने के बेहतर तरीके हैं? मुझे numpy.array और c# में संबंधित प्रश्न मिल गए हैं लेकिन बिल्कुल वही नहीं।दो संबंधित सूचियों को घुमाने के लिए बेहतर तरीका

एक पहली कोशिश के रूप में, एक सरल zip चाल करना होगा:

import random 
a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] 
b = [2, 4, 6, 8, 10] 
c = zip(a, b) 
random.shuffle(c) 
a = [e[0] for e in c] 
b = [e[1] for e in c] 
print a 
print b 

यह उत्पादन प्राप्त होगा:

[[1, 2], [7, 8], [3, 4], [5, 6], [9, 10]] 
[2, 8, 4, 6, 10] 

बस यह थोड़ा अजीब लगता है। और इसे एक अतिरिक्त सूची भी चाहिए।

+5

आप सूचियों अनज़िप करने के साथ-साथ 'zip' उपयोग कर सकते हैं:' ए, बी = जिप (* ग) ' – mgilson

+3

मैं भी आम तौर पर एक कार्यक्रम की सिफारिश नहीं होगा डिजाइन जहां आपको समांतर सूचियों का एक सेट रखने की आवश्यकता है। बस 1 सूची रखें। अपने डेटा को एकीकृत करने के लिए किसी प्रकार का वर्ग या कुछ बनाएं। – mgilson

+0

यदि कोई 'numpy' द्वारा ऐसा काम करना चाहता है, तो यहां एक अच्छा समाधान है: http: //stackoverflow.com/questions/4601373/better-way-to-shuffle-two-numpy-arrays-in-unison – Mithril

उत्तर

35

प्रश्न में दिखाए गए रिश्ते को देखते हुए, मुझे लगता है कि सूचियां एक ही लंबाई हैं और list1[i] किसी भी इंडेक्स i के लिए list2[i] से मेल खाती है। जगह में है कि इस धारणा के साथ, सूचियों फेरबदल सूचकांक फेरबदल के रूप में सरल है:

from random import shuffle 
# Given list1 and list2 
list1_shuf = [] 
list2_shuf = [] 
index_shuf = range(len(list1)) 
shuffle(index_shuf) 
for i in index_shuf: 
    list1_shuf.append(list1[i]) 
    list2_shuf.append(list2[i]) 
+9

जैसा सूची समझों का एक प्रशंसक: list1_shuf = [list1 [i] मैं index_shuf में –

+1

@kojiro: इससे कोई फर्क नहीं पड़ता: n * append_ops + n * append_ops = n * (append_ops + append_ops) = 2 * n * append_ops – Lazik

5

आप अक्सर ऐसा करने के लिए है, तो आप अनुक्रमित की एक सूची फेरबदल से अविवेक से एक स्तर को जोड़ने पर विचार कर सकता है।

Python 2.6.6 (r266:84297, Aug 24 2010, 18:13:38) [MSC v.1500 64 bit (AMD64)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random 
>>> a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] 
>>> b = [2, 4, 6, 8, 10] 
>>> indexes = range(len(a)) 
>>> indexes 
[0, 1, 2, 3, 4] 
>>> random.shuffle(indexes) 
>>> indexes 
[4, 1, 2, 0, 3] 
>>> for index in indexes: 
...  print a[index], b[index] 
... 
[9, 10] 10 
[3, 4] 4 
[5, 6] 6 
[1, 2] 2 
[7, 8] 8 
0

मैं अगर मैं कुछ यहाँ याद कर रहा हूँ यकीन नहीं है, लेकिन जैसे तुम सिर्फ सूचियों का 1 फेरबदल कर रहे हैं और एक दूसरे को पहली सूची के आदेश मैच के लिए फिर से व्यवस्थित किया जाता है यह लग रहा है। तो आपके पास यह अधिक जटिल बनाने के बिना ऐसा करने का सबसे अच्छा तरीका है। यदि आप जटिल मार्ग पर जाना चाहते हैं तो आप केवल 1 सूची को घुमा सकते हैं और शफल सूची में लुकअप करने के लिए अनछुए सूची का उपयोग कर सकते हैं और इसे इस तरह पुनर्व्यवस्थित कर सकते हैं। अंत में आप उसी परिणाम के साथ समाप्त होते हैं जिसके साथ आपने शुरुआत की थी। एक तीसरी सूची क्यों एक समस्या बना रहा है? यदि आप वास्तव में सूचियों को रीसायकल करना चाहते हैं तो आप सूची बी के लिए जो भी उपयोग कर रहे हैं उसके साथ आप सूची बी को प्रतिस्थापित कर सकते हैं और उसके बाद इसे बाद में ए और बी पर अलग कर सकते हैं।

1

एक तेज जवाब numpy का उपयोग कर here का संदर्भ लें:
आप

p = numpy.random.permutation(len(a)) 

का उपयोग दोनों सूचियों के लिए अनुक्रमित की एक नई सूची बना सकते हैं और इसका इस्तेमाल करते हैं उनका क्रम बदलने के लिए कर सकते हैं।

अपने परिदृश्य में:

In [61]: a = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]] 
In [62]: b = [2, 4, 6, 8, 10] 
In [63]: import numpy as np 
In [64]: a_ar, b_ar = np.array(a), np.array(b) 
In [65]: p = np.random.permutation(len(a)) 
In [66]: a, b = a_ar[p].tolist(), b_ar[p].tolist() 
In [68]: a 
Out[68]: [[3, 4], [7, 8], [5, 6], [1, 2], [9, 10]] 
In [69]: b 
Out[69]: [4, 8, 6, 2, 10] 
14

आप कुछ पैकेज इंस्टॉल करने के लिए तैयार कर रहे हैं:

अनुरोध: NumPy (> = 1.6.1), SciPy (> = 0.9)।

स्थापित पिप यू scikit सीखने

from sklearn.utils import shuffle 
list_1, list_2 = shuffle(list_1, list_2) 
संबंधित मुद्दे