Python में सूची से उन सभी 'y' तत्वों को हटाना जो 'x' तत्व के पहले आते हैं। x के बाद आने वाले y को रखा जाता है।
समस्या
सूची: [4, 45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8], x=8, y=4
x=8 इंडेक्स 11 पर है। y=4 इंडेक्स 0 पर है (x से पहले)। इसलिए पहला 4 हटाया जाता है।
उदाहरण
my_list = [4, 45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8]
print("मूल सूची:", my_list)
a, b = 8, 4 # x=8, y=4
index_a = my_list.index(a)
print(f"x={a} का इंडेक्स: {index_a}")
# List comprehension + enumerate
my_result = [
ele for index, ele in enumerate(my_list)
if ele != b or (ele == b and index > index_a)
]
print("परिणाम:", my_result)
आउटपुट
मूल सूची: [4, 45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8]
x=8 का इंडेक्स: 11
परिणाम: [45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8]
शर्त की व्याख्या
if ele != b or (ele == b and index > index_a)
```
अर्थ:
- यदि तत्व y (b) नहीं है → रखें
- यदि तत्व y (b) है → केवल तभी रखें जब उसका इंडेक्स x के इंडेक्स से बड़ा हो
फंक्शन के रूप में
def remove_y_before_x(lst, x, y):
"""x से पहले आने वाले सभी y को हटाएं"""
try:
x_idx = lst.index(x)
except ValueError:
return lst[:] # x नहीं मिला, मूल सूची लौटाएं
return [elem for i, elem in enumerate(lst) if elem != y or (elem == y and i > x_idx)]
# टेस्ट केस
test_cases = [
([4, 45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8], 8, 4),
([1, 2, 3, 2, 4, 2], 4, 2), # x=4 इंडेक्स 4, y=2 इंडेक्स 1,3,5 → 1,3 हटें
([1, 2, 3], 5, 2), # x नहीं मिला → मूल
([2, 2, 2, 1], 1, 2), # सभी 2, 1 से पहले → सभी हटें
([1, 2, 2, 2], 1, 2), # सभी 2, 1 के बाद → सभी रहें
]
for lst, x, y in test_cases:
print(f"x={x}, y={y}: {remove_y_before_x(lst, x, y)}")
आउटपुट
x=8, y=4: [45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8]
x=4, y=2: [1, 3, 4, 2]
x=5, y=2: [1, 2, 3]
x=1, y=2: [1]
x=1, y=2: [1, 2, 2, 2]
विविधताएं
1. x के अंतिम occurrence से पहले के y हटाएं
def remove_y_before_last_x(lst, x, y):
"""x के अंतिम occurrence से पहले के सभी y हटाएं"""
try:
last_x_idx = len(lst) - 1 - lst[::-1].index(x)
except ValueError:
return lst[:]
return [elem for i, elem in enumerate(lst) if elem != y or (elem == y and i > last_x_idx)]
print(remove_y_before_last_x([2, 1, 2, 3, 2], 3, 2)) # [1, 3, 2] (अंतिम 2 रहता है)
2. पहला y जो x के बाद आता है, केवल उसे रखें
def keep_only_first_y_after_x(lst, x, y):
"""x के बाद पहला y रखें, बाकी y हटाएं"""
try:
x_idx = lst.index(x)
except ValueError:
return [elem for elem in lst if elem != y] # x नहीं, सभी y हटाएं
result = []
y_kept = False
for i, elem in enumerate(lst):
if elem == y:
if i > x_idx and not y_kept:
result.append(elem)
y_kept = True
# else: छोड़ दें
else:
result.append(elem)
return result
print(keep_only_first_y_after_x([4, 4, 4, 8, 4, 4], 8, 4)) # [8, 4] (पहला 4 जो 8 के बाद)
3. Pandas Series में
import pandas as pd
s = pd.Series([4, 45, 75, 46, 66, 77, 48, 99, 10, 40, 5, 8])
x, y = 8, 4
try:
x_idx = s[s == x].index[0]
mask = (s != y) | ((s == y) & (s.index > x_idx))
result = s[mask].reset_index(drop=True)
print("Pandas परिणाम:\n", result)
except IndexError:
print("x नहीं मिला")