मैं लूप के लिए प्रत्येक शब्दकोश की दूसरी कुंजी निकालना चाहता हूं। हालांकि, शब्दकोश एक सूची में नेस्टेड हैं (नीचे देखें)। साथ ही, ध्यान दें कि दूसरी कुंजी हमेशा समान नहीं होती है।

video_Ids = [
{'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'},
 {'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'},
 {'kind': 'youtube#channel', 'channelId': 'UC4i5R6-IW05iiU8Vu__vppA'},
 {'kind': 'youtube#video', 'videoId': 'XquM0L2WUio'},
 {'kind': 'youtube#video', 'videoId': '05yrGVZ96b4'}
]

मैंने अलग-अलग चीजों की कोशिश की है लेकिन अब तक किसी ने भी काम नहीं किया है। यहाँ मेरा अंतिम प्रयास है: दूसरी कुंजी वाली सूची के साथ छोड़ी जाने वाली पहली कुंजी को हटाना।

for i in video_Ids:
    if video_Ids["kind"] == "youtube#video":
        del video_Ids[i]["kind"]
    elif video_Ids[i]["kind"] == "youtube#playlist":
        del video_Ids[i]["kind"]
    elif video_Ids[i]["kind"] == "youtube#channel":
        del video_Ids[i]["kind"]

मुझे यह संदेश मिलता है:

TypeError: list indices must be integers or slices, not str

मैंने अपनी तरफ से पूरी कोशिश की और कुछ दिनों के लिए इस पर अटक गया। मैं वास्तव में किसी भी मदद की सराहना करता हूं, धन्यवाद।

-1
rboemer 7 जिंदा 2021, 16:51

4 जवाब

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

शब्दकोश होने के बाद आपको अनुक्रमणिका का उपयोग करने की आवश्यकता नहीं है:

for video in video_Ids:
    if video["kind"] == "youtube#video":
        del video["kind"]
    elif video["kind"] == "youtube#playlist":
        del video["kind"]
    elif video["kind"] == "youtube#channel":
        del video["kind"]

दूसरी कुंजी निकालने के लिए, आपको प्रत्येक शब्दकोश पर पुनरावृति करने की आवश्यकता है। उदाहरण के लिए:

from itertools import islice
secondKeys = [ {k:v} for d in video_Ids for k,v in islice(d.items(),1,2)]

# or without itertools ...

secondKeys = [ {k:v} for d in video_Ids for _,(k,v),*_ in [d.items()]]
    
print(secondKeys)
[{'playlistId': 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'},
 {'playlistId': 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'},
 {'channelId': 'UC4i5R6-IW05iiU8Vu__vppA'},
 {'videoId': 'XquM0L2WUio'},
 {'videoId': '05yrGVZ96b4'}]

या, यदि आप केवल कुंजियाँ चाहते हैं, न कि संबंधित मान:

from itertools import islice
secondKeys = [ k for d in video_Ids for k in islice(d,1,2)]

# or without itertools ...

secondKeys = [ k for d in video_Ids for _,k,*_ in [d]]

print(secondKeys)
['playlistId', 'playlistId', 'channelId', 'videoId', 'videoId']
1
Alain T. 7 जिंदा 2021, 18:37

अपना कोड ठीक करने के दो तरीके हैं:

संस्करण 1

video_Ids = [
{'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'},
 {'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'},
 {'kind': 'youtube#channel', 'channelId': 'UC4i5R6-IW05iiU8Vu__vppA'},
 {'kind': 'youtube#video', 'videoId': 'XquM0L2WUio'},
 {'kind': 'youtube#video', 'videoId': '05yrGVZ96b4'}
]



for id in video_Ids:
    if id["kind"] == "youtube#video":
        del id["kind"]
    elif id["kind"] == "youtube#playlist":
        del id["kind"]
    elif id["kind"] == "youtube#channel":
        del id["kind"]

संस्करण 2

video_Ids = [
{'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'},
 {'kind': 'youtube#playlist',
  'playlistId': 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'},
 {'kind': 'youtube#channel', 'channelId': 'UC4i5R6-IW05iiU8Vu__vppA'},
 {'kind': 'youtube#video', 'videoId': 'XquM0L2WUio'},
 {'kind': 'youtube#video', 'videoId': '05yrGVZ96b4'}
]



for i in range(len(video_Ids)): #iterate over a range instead 
    if video_Ids[i]["kind"] == "youtube#video":
        del video_Ids[i]["kind"]
    elif video_Ids[i]["kind"] == "youtube#playlist":
        del video_Ids[i]["kind"]
    elif video_Ids[i]["kind"] == "youtube#channel":
        del video_Ids[i]["kind"]

जैसा कि आप इन उदाहरणों से देख सकते हैं, आप या तो सूची की लंबाई से बनाई गई सरणी के माध्यम से पुनरावृति कर सकते हैं और अनुक्रमणिका प्रदान कर सकते हैं, या सीधे सूची के माध्यम से पुनरावृति कर सकते हैं, लेकिन तब id एक अनुक्रमणिका नहीं है, लेकिन वर्तमान शब्दकोश।

0
Roland Deschain 7 जिंदा 2021, 17:26

जैसा कि अन्य ने इंगित किया है, ऐसा लगता है कि आपके if कथन में भी आपके पास एक बग है। चूंकि video_Ids के तत्व शब्दकोश हैं, i एक शब्दकोश होगा, इसलिए आपके if कथन को video_Ids[i]["kind"] के बजाय i["kind"] का संदर्भ देना चाहिए।

हालांकि, इससे भी महत्वपूर्ण बात यह है कि आपको कभी भी डिक्शनरी कीज़ के किसी विशिष्ट क्रम में होने पर भरोसा नहीं करना चाहिए। अजगर 3.7 के बाद से, कुंजियों को उसी क्रम में संरक्षित किया जाएगा जिसमें उन्हें सम्मिलित किया गया था, लेकिन इसका मतलब यह नहीं है कि वे वर्णानुक्रम में या कुछ भी क्रमबद्ध हैं। यह एक शब्दकोश की बात नहीं है। डेटा प्रकारों पर दस्तावेज़ और डिक्शनरी की-ऑर्डरिंग पर यह प्रश्न

यदि आप जानते हैं कि शब्दकोशों में दो कुंजियाँ होंगी, जिनमें से एक "दयालु" है, तो आप हमेशा कुंजी नाम खोजने के लिए कुंजियों पर पुनरावृति कर सकते हैं जो "दयालु" नहीं है, उदा .:

# optional test to check for 2 keys
assert len(i) == 2, f"Number of keys does not equal 2: {i.keys()}"

# filter the keys for the one that isn't "kind" and extract the result
other_key=[k for k in i.keys() if k != 'kind'][0]

यदि आप इसे अपने फॉर-लूप के अंदर रखते हैं तो आपके पास दूसरी कुंजी का नाम होना चाहिए, जिसका उपयोग आप अज्ञात तत्व को i[other_key] के रूप में संदर्भित करने के लिए कर सकते हैं।

दूसरा विकल्प आपके डेटा की आंतरिक संरचना का उपयोग करके कुंजियों का निर्माण करना है। ऐसा लगता है कि kind वास्तव में दूसरी कुंजी बनाने के लिए उपयोग किया जा सकता है - यह आपके डेटा का इच्छित लेआउट प्रतीत होता है। तो आपके डेटा में आईडी पुनर्प्राप्त करने का एक अन्य विकल्प प्रत्येक लूप तत्व में कुंजी बनाना है:

# use last part of kind, starting from end of "youtube#" substring
media_type = i["kind"][len("youtube#"):]

media_id_key = media_type + "ID"
media_id = i[media_id_key]
0
Michael Delgado 7 जिंदा 2021, 20:57

ये कोशिश करें:

video_Ids = [
{'kind': 'youtube#playlist',
'playlistId': 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'},
{'kind': 'youtube#playlist',
'playlistId': 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'},
{'kind': 'youtube#channel', 'channelId': 'UC4i5R6-IW05iiU8Vu__vppA'},
{'kind': 'youtube#video', 'videoId': 'XquM0L2WUio'},
{'kind': 'youtube#video', 'videoId': '05yrGVZ96b4'}
]

list_of_keys = []

for _, second_key in video_Ids:
    list_of_keys.append(second_key)

प्रिंट:

['playlistId', 'playlistId', 'channelId', 'videoId', 'videoId']

और यदि आप भी मूल्य चाहते हैं तो बस इसे लिखें:

list_of_keys = []

for index, _ in enumerate(video_Ids):
    list_of_keys.append(list(video_Ids[index].items())[1])

प्रिंट:

[('playlistId', 'PLt1O6njsCRR-D_1jUAhJrrDZyYL6OZSGa'), ('playlistId', 'PLt1O6njsCRR_8oi7E6qnPWGQbn8NoQ6sG'), ('channelId', 'UC4i5R6- IW05iiU8Vu__vppA'), ('videoId', 'XquM0L2WUio'), ('videoId', '05yrGVZ96b4')]
0
Higs 7 जिंदा 2021, 17:44