Tengo una cadena con múltiples registros. Cada registro tiene una lista variable de palabras separadas por comas. Quiero convertir cada registro en un conjunto donde las palabras en un registro son los valores del conjunto. ¿Puede aconsejarme sobre cómo convertirlo en un conjunto?

P.ej. a continuación se encuentran los dos registros en un archivo.

citrus fruit,semi-finished bread,margarine,ready soups
tropical fruit,yogurt,coffee

Me gustaría convertirlas a:

{'citrus fruit','semi-finished bread','margarine','ready soups'}
{'tropical fruit','yogurt','coffee'}
-1
aseem puri 9 sep. 2018 a las 05:46

3 respuestas

La mejor respuesta

No estoy convencido de que quieras un set, ya que en tu ejemplo estás enumerando todo en orden en el resultado deseado. set s no están ordenados y no pueden contener duplicados. Tampoco está claro cómo se delimitan sus registros.

Aquí hay un ejemplo que mantendrá el orden, usando list:

>>> first_record = "citrus fruit,semi-finished bread,margarine,ready soups"
>>> second_record = "tropical fruit,yogurt,coffee"
>>> def tokenize(s, delim=","):
...   return s.split(delim)
... 
>>> first_result = tokenize(first_record)
>>> first_result
['citrus fruit', 'semi-finished bread', 'margarine', 'ready soups']
>>> second_result = tokenize(second_record)
>>> second_result
['tropical fruit', 'yogurt', 'coffee']

Y si realmente quieres un set, simplemente envuélvelo en una llamada al constructor set:

>>> first_result_set = set(first_result)
>>> second_result_set = set(second_result)
>>> first_result_set
{'margarine', 'ready soups', 'semi-finished bread', 'citrus fruit'}
>>> second_result_set
{'coffee', 'yogurt', 'tropical fruit'}

EDITAR: puede hacerlo todo en un shebang ya que sabemos que los registros están delimitados por newline:

>>> records = "citrus fruit,semi-finished bread,margarine,ready soups\ntropical fruit,yogurt,coffee"
>>> def setitize_records(records, record_delim="\n", item_delim=","):
...   record_list = records.split(record_delim)
...   record_sets = [set(record.split(",")) for record in record_list]
...   return record_sets
... 
>>> result = setitize_records(records)
>>> result
[{'margarine', 'ready soups', 'semi-finished bread', 'citrus fruit'}, {'coffee', 'yogurt', 'tropical fruit'}]
0
Matt Messersmith 9 sep. 2018 a las 03:10

Esto debería funcionar para ti. Echale un vistazo.

rec = "citrus fruit,semi-finished bread,margarine,ready soups tropical
fruit,yogurt,coffee"
#result 
myset = set() 

while rec != "":
    head, _ , rec = rec.partition(',')
    myset.add(head)
print(myset)
0
Rahul Sharma 9 sep. 2018 a las 06:25

Utiliza el módulo csv.

import csv

def readsets(filename):
    with open(filename) as f:
        for row in csv.reader(f):
            yield set(row)
0
gilch 9 sep. 2018 a las 02:55