একই আদেশে একবারে দুটি তালিকা সাফ করুন


94

আমি nltkগ্রন্থাগারের movie_reviewsকর্পস ব্যবহার করছি যার মধ্যে প্রচুর নথি রয়েছে। আমার কাজটি ডেটা প্রাক প্রসেসিং এবং প্রাক প্রক্রিয়াজাতকরণ ছাড়াই এই পর্যালোচনাগুলির পূর্বাভাসজনক পারফরম্যান্স পাচ্ছে। তবে তালিকায় সমস্যা আছে documentsএবং documents2আমার একই ডকুমেন্ট রয়েছে এবং উভয় তালিকায় একই ক্রম রাখতে আমার এগুলি বদলাতে হবে। আমি এগুলিকে আলাদাভাবে বদলাতে পারছি না কারণ প্রতিবার আমি তালিকাটি বদলে ফেললে আমি অন্যান্য ফলাফল পেয়ে থাকি। এজন্যই আমাকে একই ক্রমের সাথে একবারে বদলানো দরকার কারণ আমার শেষের দিকে তাদের তুলনা করা দরকার (এটি অর্ডের উপর নির্ভর করে)। আমি পাইথন ২.7 ব্যবহার করছি

উদাহরণ (প্রকৃতপক্ষে স্ট্রিংগুলি টোকানাইজড, তবে এটি আপেক্ষিক নয়):

documents = [(['plot : two teen couples go to a church party , '], 'neg'),
             (['drink and then drive . '], 'pos'),
             (['they get into an accident . '], 'neg'),
             (['one of the guys dies'], 'neg')]

documents2 = [(['plot two teen couples church party'], 'neg'),
              (['drink then drive . '], 'pos'),
              (['they get accident . '], 'neg'),
              (['one guys dies'], 'neg')]

এবং উভয় তালিকাগুলি বদলানোর পরে আমার এই ফলাফলটি পাওয়া দরকার:

documents = [(['one of the guys dies'], 'neg'),
             (['they get into an accident . '], 'neg'),
             (['drink and then drive . '], 'pos'),
             (['plot : two teen couples go to a church party , '], 'neg')]

documents2 = [(['one guys dies'], 'neg'),
              (['they get accident . '], 'neg'),
              (['drink then drive . '], 'pos'),
              (['plot two teen couples church party'], 'neg')]

আমার এই কোডটি রয়েছে:

def cleanDoc(doc):
    stopset = set(stopwords.words('english'))
    stemmer = nltk.PorterStemmer()
    clean = [token.lower() for token in doc if token.lower() not in stopset and len(token) > 2]
    final = [stemmer.stem(word) for word in clean]
    return final

documents = [(list(movie_reviews.words(fileid)), category)
             for category in movie_reviews.categories()
             for fileid in movie_reviews.fileids(category)]

documents2 = [(list(cleanDoc(movie_reviews.words(fileid))), category)
             for category in movie_reviews.categories()
             for fileid in movie_reviews.fileids(category)]

random.shuffle( and here shuffle documents and documents2 with same order) # or somehow

উত্তর:


230

আপনি এটি হিসাবে এটি করতে পারেন:

import random

a = ['a', 'b', 'c']
b = [1, 2, 3]

c = list(zip(a, b))

random.shuffle(c)

a, b = zip(*c)

print a
print b

[OUTPUT]
['a', 'c', 'b']
[1, 3, 2]

অবশ্যই, সহজ তালিকা সহ এটি একটি উদাহরণ ছিল, তবে অভিযোজনটি আপনার ক্ষেত্রে একই হবে।

আশা করি এটা সাহায্য করবে. শুভকামনা


ধন্যবাদ, এটাই আমার দরকার।
জারোস্লাভ ক্লেমাক

4
(উত্তর প্রশ্ন) - * এর অর্থ কী?
18

4
@ ᔕᖺᘎᕊ, এর অর্থ সি এর মানগুলি আনপ্যাক করুন সুতরাং এটির zip(1,2,3)পরিবর্তে বলা হয়zip([1,2,3])
sshashank124

4
আমি আগে ও এই সমাধান ব্যবহৃত aএবং bশেষে তালিকা ছিল। পাইথন ৩.6.৮ সহ একই উদাহরণের শেষে, আমি পাই aএবং bটিপলস হিসাবে।
ভিনজি

4
... টিপলস ... তাই কেবল একটি = তালিকা (ক) এবং খ = তালিকা (খ)
রিচার্ডবিজে

40

আমি এটি করার একটি সহজ উপায় পেয়েছি

import numpy as np
a = np.array([0,1,2,3,4])
b = np.array([5,6,7,8,9])

indices = np.arange(a.shape[0])
np.random.shuffle(indices)

a = a[indices]
b = b[indices]
# a, array([3, 4, 1, 2, 0])
# b, array([8, 9, 6, 7, 5])

মূল পোস্টটি পাইথনের সাধারণ তালিকাগুলি সম্পর্কে, তবে ন্যালি অ্যারেগুলির জন্য আমার একটি সমাধান দরকার। তুমি শুধু আমার দিন বাঁচিয়েছ!
ফিঙ্গু

11
from sklearn.utils import shuffle

a = ['a', 'b', 'c','d','e']
b = [1, 2, 3, 4, 5]

a_shuffled, b_shuffled = shuffle(np.array(a), np.array(b))
print(a_shuffled, b_shuffled)

#random output
#['e' 'c' 'b' 'd' 'a'] [5 3 2 4 1]

6

একসাথে তালিকার একটি সালিশ নম্বর শফল করুন।

from random import shuffle

def shuffle_list(*ls):
  l =list(zip(*ls))

  shuffle(l)
  return zip(*l)

a = [0,1,2,3,4]
b = [5,6,7,8,9]

a1,b1 = shuffle_list(a,b)
print(a1,b1)

a = [0,1,2,3,4]
b = [5,6,7,8,9]
c = [10,11,12,13,14]
a1,b1,c1 = shuffle_list(a,b,c)
print(a1,b1,c1)

আউটপুট:

$ (0, 2, 4, 3, 1) (5, 7, 9, 8, 6)
$ (4, 3, 0, 2, 1) (9, 8, 5, 7, 6) (14, 13, 10, 12, 11)

নোট:
বস্তু দ্বারা ফিরে shuffle_list()হয় tuples

পিএসেও shuffle_list()আবেদন করা যায়numpy.array()

a = np.array([1,2,3])
b = np.array([4,5,6])

a1,b1 = shuffle_list(a,b)
print(a1,b1)

আউটপুট:

$ (3, 1, 2) (6, 4, 5)

4

এটি করার সহজ ও দ্রুত উপায় হল random.seuff () এর সাথে random.seed () ব্যবহার করা। এটি আপনাকে চাইলে বহুবার একই র্যান্ডম অর্ডার তৈরি করতে দেয়। এটি দেখতে এটির মতো হবে:

a = [1, 2, 3, 4, 5]
b = [6, 7, 8, 9, 10]
seed = random.random()
random.seed(seed)
a.shuffle()
random.seed(seed)
b.shuffle()
print(a)
print(b)

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

স্মৃতি সমস্যার কারণে আপনি যখন একই সাথে উভয় তালিকার সাথে কাজ করতে পারবেন না তখন এটি কাজ করে।


4
এটিকে এলোমেলো করা উচিত না sh
খান

-2

শফলিংয়ের ক্রম ঠিক করতে আপনি সাফল্যের দ্বিতীয় যুক্তিটি ব্যবহার করতে পারেন।

বিশেষত, আপনি শফল ফাংশনের দ্বিতীয় যুক্তিটি শূন্য আর্গুমেন্ট ফাংশনটি পাস করতে পারেন যা [0, 1) এর মধ্যে একটি মান দেয়। এই ফাংশনের রিটার্ন মান শফলিংয়ের ক্রম স্থির করে। (ডিফল্টরূপে অর্থাৎ আপনি যদি দ্বিতীয় তর্ক হিসাবে কোনও ফাংশনটি পাস না করেন তবে এটি ফাংশনটি ব্যবহার করে random.random()You আপনি এটি এখানে 277 লাইনে দেখতে পারেন ))

এই উদাহরণটি বর্ণনা করে যা আমি বর্ণনা করেছি:

import random

a = ['a', 'b', 'c', 'd', 'e']
b = [1, 2, 3, 4, 5]

r = random.random()            # randomly generating a real in [0,1)
random.shuffle(a, lambda : r)  # lambda : r is an unary function which returns r
random.shuffle(b, lambda : r)  # using the same function as used in prev line so that shuffling order is same

print a
print b

আউটপুট:

['e', 'c', 'd', 'a', 'b']
[5, 3, 4, 1, 2]

random.shuffleফাংশন কল randomএকাধিকবার ফাংশন তাই ব্যবহার করে একটি lambdaযে সবসময় একই মান আউটপুট অর্ডার অনিচ্ছাকৃত প্রভাব থাকে।
ব্ল্যাকঙ্কহট

তুমি ঠিক. এটি আর এর মানের উপর নির্ভর করে পক্ষপাতদুষ্ট বদল হবে। এটি বেশিরভাগ ক্ষেত্রে ব্যবহারিকভাবে ভাল হতে পারে তবে সবসময় না।
কুন্দন কুমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.