मुझे नहीं पता कि मैं इसे सबसे अच्छे तरीके से लिख रहा हूं, लेकिन अनिवार्य रूप से मैं विभिन्न स्थितियों के आधार पर सूचियों की एक सूची बनाना चाहता हूं।

मैंने ElementTree का उपयोग करके कुछ XML डेटा में पढ़ा और इसे पार्स करने के बाद, मैं पेड़ के माध्यम से पुनरावृति करता हूं और सभी टैग्स को tags नामक सूची में रखता हूं और उनके मान vals नामक सूची में रखता हूं।

टैग की मेरी सूची में, कुछ वाक्य टैग हैं जिन्हें मैं एक शब्दकोश की कुंजी बनाना चाहता हूं और संबंधित मान एक सूची में जोड़ते हैं और मान बनाते हैं।

टैग की मेरी सूची, उनके संबंधित मान और वाक्य टैग नीचे की तरह दिखते हैं।

tags = ['irrel', 'TAG_ONE', 'TAG_ONE', 'TAG_TWO', 'TAG_ONE', 'TAG_TWO', 'irrel']

vals = ['not_rel', 1, 2, 5, 3, 6, 'not_rel']

sent_tags = ['TAG_ONE', 'TAG_TWO']

मेरा आदर्श आउटपुट tags_dict = {'TAG_ONE': [1, 2, 3], 'TAG_TWO': [5, 6]} है जिसे मैंने नीचे दिए गए कोड का उपयोग करके हासिल किया है।

sent_vals = list()

# Make a list of all TAG_ONE values and append list to sentence values list
tag_one = list()
tag_one_locs = [i for i, x in enumerate(tags) if x == 'TAG_ONE']
for t in tag_one_locs:
    tag_one.append(vals[t])
sent_vals.append(tag_one)

# make a list of all TAG_TWO values and append list to sentence values list
tag_two = list()
tag_two_locs = [i for i, x in enumerate(tags) if x == 'TAG_TWO']
for tt in tag_two_locs:
    tag_two.append(vals[tt])
sent_vals.append(tag_two)

tags_dict = dict(zip(sent_tags, sent_vals))

हालांकि, यह काफी बदसूरत है और कोड को दस लाख बार कॉपी और पेस्ट करना अव्यवहारिक है क्योंकि मेरे वास्तविक डेटा में लगभग 70 वाक्य टैग हैं। मैं किसी प्रकार की सूची समझ (या कुछ और) में कोड को सरल बनाने के तरीके पर एक रिक्त रेखा खींच रहा हूं।

2
carousallie 5 सितंबर 2019, 23:43

2 जवाब

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

एक तानाशाही समझ:

{sent_tag: [vals[ind] for ind, tag in enumerate(tags) if tags[ind] == sent_tag] for sent_tag in sent_tags}

इस तरह के कोड के बारे में सोचें यदि समझ संरचना आपके लिए भ्रमित कर रही है:

output = {}
for sent_tag in sent_tags:
    val_list = []

    for ind, tag in enumerate(tags):
        if tags[ind] == sent_tag:
            val_list.append(vals[ind])

    output.update({sent_tag: val_list})

किसी भी तरह से:

आपका आउटपुट होगा:

{'TAG_ONE': [1, 2, 3], 'TAG_TWO': [5, 6]}
1
Brian Joseph 6 सितंबर 2019, 17:06

ठीक है, आप collections.defaultdict(list) का उपयोग करके इसे बहुत सरल बना सकते हैं

  • ज़िप टैग और मान एक साथ
  • यदि टैग किसी दिलचस्प टैग से मेल खाता है, तो शब्दकोश में जोड़ें

इस तरह:

import collections

tags = ['irrel', 'TAG_ONE', 'TAG_ONE', 'TAG_TWO', 'TAG_ONE', 'TAG_TWO', 'irrel']

vals = ['not_rel', 1, 2, 5, 3, 6, 'not_rel']

sent_tags = {'TAG_ONE', 'TAG_TWO'}  # set is preferred when a lot of elements (faster "in" lookup)

tags_dict = collections.defaultdict(list)

for tag,val in zip(tags,vals):
    if tag in sent_tags:
        tags_dict[tag].append(val)

print(dict(tags_dict))  # convert to dict just to print

नतीजा:

{'TAG_TWO': [5, 6], 'TAG_ONE': [1, 2, 3]})
2
Jean-François Fabre 6 सितंबर 2019, 16:49