Python come estrarre tutti gli elementi della lista se iniziano con lo stesso set di caratteri

devo dividere un elenco di parole POS taggate in sotto-liste in base al tag POS utilizzato. la mia lista appare così:

List=[", -> ','", ". -> '!'", ". -> '.'", ". -> '?'", "CC -> 'but'", "CD -> 'hundred'",
      "CD -> 'one'", "DT -> 'the'", "EX -> 'There'","IN -> 'as'", "IN -> 'because'",
      "IN -> 'if'", "IN -> 'in'", "JJ -> 'Sure'", 'MD -> "\'ll"', "MD -> 'ca'",
      "MD -> 'can'", "MD -> 'will'", "MD -> 'would'", "NN -> 'Applause'",
      "NN -> 'anybody'", "NN -> 'doubt'", "NNP -> 'Syria'",
      "NNS -> 'Generals'", "NNS -> 'people'", "NNS -> 'states'",  "PRP -> 'it'",
      "PRP$ -> 'our'",  "RB -> 'there'", "RBR -> 'more'", "RP -> 'out'", "TO -> 'to'",
      "UH -> 'Oh'", "UH -> 'Wow'", "VB -> 'stop'", "VB -> 'want'", "VBD -> 'knew'",
      "VBD -> 'was'", "VBG -> 'allowing'", "VBG -> 'doing'", "VBG -> 'going'",
      "VBN -> 'called'", "VBP -> 'take'", 'VBZ -> "\'s"', "VBZ -> 'is'", 
      "WDT -> 'that'", "WP -> 'what'"]

il mio output desiderato sarebbe qualcosa come

[["IN -> 'as'", "IN -> 'because'", "IN -> 'if'", "IN -> 'in'"],["UH -> 'Oh'", "UH -> 'Wow'"]]

o anche meglio

CC = ['but']
CD = ['hundred', 'one']

ho cercato un bel po ‘ma l’unica funzione che ho potuto scoprire che almeno in parte fa il lavoro è questo:

from itertools import groupby
print([list(g) for k, g in groupby(List, key=lambda x: x[0])])

ho giocato con il valore di x, ma norhing sembra funzionare molto bene.

ho anche parlato di usare qualcosa come questo:

RB = []
for item in List:
    if item.startswith('RB'):
        g=re.findall('-> (.*)', item)
        RB.append(g)

questo dovrebbe certamente funzionare, ma sarebbe un dolore farlo per i circa 40 diversi tag POS. ci deve essere un modo più semplice.

EN From: Python how to extract all list elements if they start with the same character set

More similar articles:

5 Comments

  1. utilizzare un defaultdict:

    from collections import defaultdict
    
    List = [", -> ','", ". -> '!'", ". -> '.'", ". -> '?'", "CC -> 'but'", "CD -> 'hundred'",
          "CD -> 'one'", "DT -> 'the'", "EX -> 'There'","IN -> 'as'", "IN -> 'because'",
          "IN -> 'if'", "IN -> 'in'", "JJ -> 'Sure'", 'MD -> "\'ll"', "MD -> 'ca'",
          "MD -> 'can'", "MD -> 'will'", "MD -> 'would'", "NN -> 'Applause'",
          "NN -> 'anybody'", "NN -> 'doubt'", "NNP -> 'Syria'",
          "NNS -> 'Generals'", "NNS -> 'people'", "NNS -> 'states'",  "PRP -> 'it'",
          "PRP$ -> 'our'",  "RB -> 'there'", "RBR -> 'more'", "RP -> 'out'", "TO -> 'to'",
          "UH -> 'Oh'", "UH -> 'Wow'", "VB -> 'stop'", "VB -> 'want'", "VBD -> 'knew'",
          "VBD -> 'was'", "VBG -> 'allowing'", "VBG -> 'doing'", "VBG -> 'going'",
          "VBN -> 'called'", "VBP -> 'take'", 'VBZ -> "\'s"', "VBZ -> 'is'", 
          "WDT -> 'that'", "WP -> 'what'"]
    
    data = defaultdict(set)
    for key, value in (_.split('->') for _ in List):
      d[key.strip()].add(value.strip().replace("'", '').replace('"', ''))
    print(dict(data))

    questo si traduce in:

    {',': {','}, '.': {'.', '!', '?'}, 'CC': {'but'}, 'CD': {'hundred','one'}, 'DT': {'the'}, 'EX': {'There'}, 'IN': {'in', 'because', 'as', 'if'}, 'JJ': {'Sure'}, 'MD': {'will', 'ca', 'll', 'can', 'would'}, 'NN': {'Applause', 'doubt', 'anybody'}, 'NNP': {'Syria'}, 'NNS': {'Generals', 'states', 'people'}, 'PRP': {'it'}, 'PRP$': {'our'}, 'RB': {'there'}, 'RBR': {'more'}, 'RP': {'out'}, 'TO': {'to'}, 'UH': {'Wow', 'Oh'}, 'VB': {'want', 'stop'}, 'VBD': {'was', 'knew'}, 'VBG': {'going', 'allowing', 'doing'}, 'VBN': {'called'}, 'VBP': {'take'}, 'VBZ': {'s', 'is'}, 'WDT': {'that'}, 'WP': {'what'}}
    1. grazie mille! questo sembra promettente. ma come sono abbastanza nuovo a questo, devo chiedere come faccio a lavorare con questi valori ora? come faccio ad esempio a guardare solo le parole etichettate con VBZ?

    2. mi dispiace di preoccuparsi ancora una volta, ma potrebbe chiarire che un po ‘di più? sono abbastanza nuovo alla programmazione e più spesso, risposte che trovo su StackOverflow mi confondono molto a causa della loro brevità.

Leave a Reply

Your email address will not be published. Required fields are marked *