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

# All lists have a length of 20

flight_ID = ['1064662221', '1064617390', '1064614152', '1064614152', \
 '1064775880', '1064645826', '1064645826', '1064664535', '1064659772', \
 '1064659772', '1064614050', '1064614050', '1064614286', '1064614286', \
'1064614286', '1064614286', '1064614286', '1064614286', '1064614286', '1064646536']

flight_number = ['1827', '1585', '8409', '1465', '30', '9188', '2232', '3760', '579', '3309', '1259', '2193', '6566', '2231', '5214', '8601', '3169', '1601', '7832', '335']

airline_Code = ['TK', 'AY', 'DL', 'AF', 'FX', 'UA', 'LH', 'U2', 'SK', 'A3', 'AF', 'KL', 'VS', 'UX', 'G3', 'UU', 'KQ', 'AF', 'AR', 'LO']

मैंने मुख्य सूची से डुप्लीकेट हटाने के लिए निम्न फ़ंक्शन का उपयोग किया:

def remove_dup(a):
   i = 0
   while i < len(a):
      j = i + 1
      while j < len(a):
         if a[i] == a[j]:
            del a[j]
         else:
            j += 1
      i += 1

remove_dup(flight_ID)

# OUTPUT
['1064662221', '1064617390', '1064614152', '1064775880', '1064645826', '1064664535', '1064659772', '1064614050', '1064614286', '1064646536']

# 10 elements have been removed.

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

नोट: हालांकि मुख्य सूची में डुप्लिकेट आइटम दिखाई देते हैं, अन्य सूचियों के आइटम नहीं होते हैं

2
B A C H A S H 8 जुलाई 2021, 23:06

4 जवाब

सबसे बढ़िया उत्तर

मैं Pandas का उपयोग करने का सुझाव दूंगा यदि आप अपने द्वारा वर्णित तरीके से स्वरूपित डेटा के साथ और अधिक करने जा रहे हैं क्योंकि यह डुप्लिकेट को दर्द-मुक्त तरीके से हटाने जैसे संचालन को संभव बनाता है:

import pandas as pd

# Make a DataFrame
flight_ID = ['1064662221', '1064617390', ...]
flight_number = ['1827', '1585', '8409', ...]
airline_Code = ['TK', 'AY', 'DL', ...]

df = pd.DataFrame({'flight_ID': flight_ID,
                   'flight_number': flight_number,
                   'airline_Code': airline_Code})

# Remove duplicates - just one line!
df.drop_duplicates('flight_ID', inplace=True)

आपको एक डेटाफ़्रेम मिलता है जो इस तरह दिखता है:

     flight_ID flight_number airline_Code
0   1064662221          1827           TK
1   1064617390          1585           AY
2   1064614152          8409           DL
4   1064775880            30           FX
5   1064645826          9188           UA
7   1064664535          3760           U2
8   1064659772           579           SK
10  1064614050          1259           AF
12  1064614286          6566           VS
19  1064646536           335           LO
2
fsimonjetz 8 जुलाई 2021, 20:24

यहां कुछ तरीके दिए गए हैं, लेकिन मैं इस तरह के डेटा का प्रतिनिधित्व करने के लिए कक्षा का उपयोग करने के बारे में सोचूंगा (इसी तरह नामांकित उदाहरण कैसे काम करता है)

फ्लाइट_आईडी को डिक्शनरी में कुंजी के रूप में जोड़ना उन्हें अद्वितीय बनाता है, जिसमें इंडेक्स के रूप में मान होते हैं:

flight_ID_inds = {f: i for i, f in enumerate(flight_ID)}
flight_ID = list(flight_ID_inds.keys())
flight_number = [flight_number[i] for i in flight_ID_inds.values()]
airline_Code = [airline_Code[i] for i in flight_ID_inds.values()]

फिर से, लेकिन सूचकांक के बजाय अन्य सूची डेटा के लिए टुपल के रूप में मूल्यों के साथ:

dic = {fid: (fn, ac) for fid, fn, ac in zip(flight_ID, flight_number, airline_Code)}
flight_ID = list(dic.keys())
flight_number = [x[0] for x in dic.values()]
airline_Code = [x[1] for x in dic.values()]

नामित टुपल का उपयोग करना (सूची-की-डिक्ट्स प्रतिनिधित्व का उपयोग करना भी काम करेगा):

from collections import namedtuple

flight_nt = namedtuple("Flight", "flight_ID, flight_number, airline_Code")

flights = [flight_nt(fid, fn, ac) for fid, fn, ac in zip(flight_ID, flight_number, airline_Code)]
uniq_ids = set()
uniq_flights = []
for f in flights:
    if f.flight_ID not in uniq_ids:
        uniq_ids.add(f.flight_ID)
        uniq_flights.append(f)
flight_ID = [x.flight_ID for x in uniq_flights]
flight_number = [x.flight_number for x in uniq_flights]
airline_Code = [x.airline_Code for x in uniq_flights]

मैं इस तरह की समस्या के लिए ऑब्जेक्ट ओरिएंटेड (कक्षा या डेटाक्लास) की अनुशंसा करता हूं:

class Flight:
    def __init__(self, flight_id, flight_number, airline_code):
        self.flight_id = flight_id
        self.flight_number = flight_number
        self.airline_code = airline_code

    def __hash__(self):
        return hash(self.flight_id)

    def __eq__(self, other):
        return other.flight_id == self.flight_id

flights = [Flight(fid, fn, ac) for fid, fn, ac in zip(flight_ID, flight_number, airline_Code)]
uniq_flights = set(flights)
0
maneblusser 8 जुलाई 2021, 20:31

@Prune का एक बेहतर समाधान है, लेकिन आप हमेशा enumerate() का उपयोग कर सकते हैं

for index, id in enumerate(flight_ID):
    if id in flight_ID[index:]:
        del flight_ID[index]
        del flight_number[index]
        del airline_Code[index]

ध्यान दें कि यह ऑर्डर को संरक्षित नहीं करता है, अगर आप ऐसा करना चाहते हैं तो आपको स्लाइस में मूल्य की अनुक्रमणिका ढूंढनी होगी।

0
Amos Baker 8 जुलाई 2021, 20:36

आप पहले यह निर्धारित कर सकते हैं कि किसे रखना/निकालना है और फिर itertools.compress तत्वों को हटाने के लिए:

import itertools as it

keep = []
seen = set()
for x in flight_ID:
    keep.append(x not in seen)
    seen.add(x)

flight_ID = list(it.compress(flight_ID, keep))
flight_number = list(it.compress(flight_number, keep))
airline_Code = list(it.compress(airline_Code, keep))

हालाँकि चूंकि यह डेटा तार्किक रूप से एक साथ लगता है, शायद इसके लिए एक समर्पित कंटेनर वर्ग बनाना एक अच्छा विचार होगा, उदा। द्वारा namedtuple:

from collections import namedtuple

FlighData = namedtuple('id number code')

data = [FlightData(*x) for x in zip(flight_ID, flight_number, airline_Code)]

फिर दूसरा तरीका यह होगा कि itertools.groupby का इस्तेमाल किया जाए :

unique_data = list(next(g) for k, g in it.groupby(sorted(data), key=op.itemgetter(0)))
0
a_guest 8 जुलाई 2021, 21:19