পাইথনে অ্যারে ফিল্টার?


87

উদাহরণস্বরূপ, আমার দুটি তালিকা রয়েছে

 A           = [6, 7, 8, 9, 10, 11, 12]
subset_of_A  = [6, 9, 12]; # the subset of A


the result should be [7, 8, 10, 11]; the remaining elements 

এটি করার জন্য পাইথনের কোনও বিল্ট-ইন ফাংশন রয়েছে?

উত্তর:


122

অর্ডারটি গুরুত্বপূর্ণ না হলে আপনার ব্যবহার করা উচিত set.difference। তবে, আপনি যদি অর্ডার বজায় রাখতে চান তবে একটি সাধারণ তালিকা বোধগম্যতা এটি লাগে।

result = [a for a in A if a not in subset_of_A]

সম্পাদনা: ডেলানান বলেছেন যে, subset_of_Aআসল হলে পারফরম্যান্সে যথেষ্ট উন্নতি হবে set, যেহেতু setতালিকার ও (এন) এর তুলনায় একটিতে সদস্যপদ পরীক্ষা করা ও (1) হয়।

A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A

result = [a for a in A if a not in subset_of_A]

14
এবং এটি subset_of_Aএকটি বাস্তব তৈরি করে ব্যাপকভাবে উন্নতি করা যেতে পারে setযা O(1)সদস্যপদ পরীক্ষা দেয় ( O(n)তালিকার পরিবর্তে )।

56

হ্যাঁ, filterফাংশন:

filter(lambda x: x not in subset_of_A, A)

8
দ্রষ্টব্য যে পাইথন 2 এ, filterতালিকাটি নিজেই ফিরে আসে, যখন পাইথন 3-এ, এটি পুনরাবৃত্তিকে দেয়।
modulitos

16
@ মডুলিটোসlist(filter(...))
পাওয়ে

7

না, অজগরটিতে এটি করার জন্য কোনও ফাংশন বিল্ড নেই, কারণ কেবল:

set(A)- set(subset_of_A)

আপনি উত্তর প্রদান করবে।


4
যদিও এটি তার উদাহরণের জন্য কাজ করে, সমস্যাগুলি তালিকায়
এগুলিতে

6

set(A)-set(subset_of_A)আপনার উদ্দেশ্যে ফলাফল সেট দেয়, কিন্তু এটি মূল ক্রম ধরে রাখতে পারে না। নিম্নলিখিত সংরক্ষণের সংরক্ষণের আদেশ:

[a for a in A if not a in subset_of_A]



3

কয়েক দিন আগে এটি জিজ্ঞাসা করা হয়েছিল (তবে আমি এটি খুঁজে পাচ্ছি না):

>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]

setপ্রসঙ্গের উপর নির্ভর করে শুরু থেকে গুলি ব্যবহার করা ভাল । তারপরে আপনি অন্যান্য উত্তর শোয়ের মতো সেট অপারেশন ব্যবহার করতে পারেন ।

তবে কেবলমাত্র এই ক্রিয়াকলাপের জন্য তালিকাগুলিকে সেটগুলিতে এবং পিছনে রূপান্তর করা তালিকা বোধের চেয়ে ধীর।




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