Tuple verilerini bir satırda ayrıştırma

Kullanıcı girişi formunu bir satırda almak zorundayım:

C = (39.447; 94.657; 11.824) N = (39.292; 95.716; 11.027) Ca = (39.462; 97.101; 11.465)

Ve çevirmek zorundayım, bu yüzden her biri uygun dizgiye karşılık gelen üç değişkenim var. Bu, noktalı virgüllerle ve bir satırda olması gerektiği gerçeğiyle karmaşık.

Şu ana kadar sahip olduğum şey bu, ancak bir satır olarak ayrıştırmakta güçlük çekiyorum, girişin değişken bir atamaya benzemesi nedeniyle eval() 'nin çalışabileceğini düşündüm, ancak "SyntaxError değişmeze atayamıyor" alıyorum. Bunu yapmanın basit bir yolu olması gerektiğini düşünüyorum.

class TupleClean(str):
    def clean(self):
        new_list = []
        clean_coord = self.strip("() ")
        split_coord = clean_coord.split(";")
        for i in split_coord:
            new_list.append(float(i))
        tuple_coord = (new_list[0], new_list[1], new_list[2])
        return(tuple_coord)

coord_1 = input("Input the coordinates for carbon in the format (p; q; r): ")
coord_2 = input("Input the coordinates for nitrogen in the format (p; q; r): ")
coord_3 = input("Input the coordinates for calcium in the format (p; q; r): ")

coord_1_clean = TupleClean(coord_1)
coord_1_clean = coord_1_clean.clean()
coord_2_clean = TupleClean(coord_2)
coord_2_clean = coord_2_clean.clean()
coord_3_clean = TupleClean(coord_3)
coord_3_clean = coord_3_clean.clean()
0
Hacky yolu: exec (s.replace (';', ','). Replace (')', ');'))
katma yazar Ismail Badawi, kaynak
@ Sam programım tüm verileri sizin için bir sözlük içine yerleştiriyor.
katma yazar Malik Brahimi, kaynak
@ Sam programım tüm verileri sizin için bir sözlük içine yerleştiriyor.
katma yazar Malik Brahimi, kaynak
{id: [float (e) için re.findall (r '(\ d + \. \ d +)', t)], id için, t t re.findall (r '(\ w +) \ s * = \ s * (\ ([^)] + \)) ', s)}
katma yazar dawg, kaynak
{id: [float (e) için re.findall (r '(\ d + \. \ d +)', t)], id için, t t re.findall (r '(\ w +) \ s * = \ s * (\ ([^)] + \)) ', s)}
katma yazar dawg, kaynak
@IsmailBadawi Teşekkürler! Tam ihtiyacım olan şeydi, regex olmadan mümkün olduğunu biliyordum.
katma yazar Sam, kaynak
@IsmailBadawi Teşekkürler! Tam ihtiyacım olan şeydi, regex olmadan mümkün olduğunu biliyordum.
katma yazar Sam, kaynak

8 cevap

Normal ifadelerle, tek bir girdiye girebilir ve şöyle bir veri sözlüğü oluşturabilirsiniz:

import re

regex = r'(\w+) = \(([\d.]+); ([\d.]+); ([\d.]+)\)'
data = re.findall(regex, input('Enter all data: '))
data = {i[0]:[float(j) for j in i[1:]] for i in data}
0
katma

Normal ifadelerle, tek bir girdiye girebilir ve şöyle bir veri sözlüğü oluşturabilirsiniz:

import re

regex = r'(\w+) = \(([\d.]+); ([\d.]+); ([\d.]+)\)'
data = re.findall(regex, input('Enter all data: '))
data = {i[0]:[float(j) for j in i[1:]] for i in data}
0
katma

Ben sadece bir dize ayrıştırmak için str alt sınıfının sıradışı olduğunu düşünüyorum. Regex ayrıştırma kullanmanızı öneririm.

COORDINATES_REGEX = re.compile(r'^\(([\d.]+);\s([\d.]+);\s([\d.]+)\)$')
match = COORDINATES_REGEX.match(coords_1)
if match is None:
     raise ValueError("Invalid input")
coords = tuple(map(float, match.groups()))
0
katma

Ben sadece bir dize ayrıştırmak için str alt sınıfının sıradışı olduğunu düşünüyorum. Regex ayrıştırma kullanmanızı öneririm.

COORDINATES_REGEX = re.compile(r'^\(([\d.]+);\s([\d.]+);\s([\d.]+)\)$')
match = COORDINATES_REGEX.match(coords_1)
if match is None:
     raise ValueError("Invalid input")
coords = tuple(map(float, match.groups()))
0
katma

Giriş formatı her zaman aynıysa neden yakalama gruplarıyla normal ifadeler kullanmayın ve sonra yakalanan grupları yüzmeye dönüştürün ve bunları üç değişken olarak üç değişkene atayın?

0
katma

Giriş formatı her zaman aynıysa neden yakalama gruplarıyla normal ifadeler kullanmayın ve sonra yakalanan grupları yüzmeye dönüştürün ve bunları üç değişken olarak üç değişkene atayın?

0
katma

tuple sınıfının yapıcısı, bağımsız değişken olarak yinelenebilir:

class TupleClean(str):
    def clean(self):
        new_list = []
        clean_coord = self.strip("() ")
        return tuple(map(float, clean_coord.split(";")))

(harita, float işlevini clean_coord.split (";") listesinin her öğesine uygular)

0
katma

tuple sınıfının yapıcısı, bağımsız değişken olarak yinelenebilir:

class TupleClean(str):
    def clean(self):
        new_list = []
        clean_coord = self.strip("() ")
        return tuple(map(float, clean_coord.split(";")))

(harita, float işlevini clean_coord.split (";") listesinin her öğesine uygular)

0
katma