Chcę utworzyć listę krotek i mieć taką tabelę:

Nr  Name        Value   F/R
1   6347_sx     123.98  F
2   hff_475     234.99  F
3   sjdh_65     123.67  R
4   6347_sx     345.12  R

Chcę mieć taką listę:

norm_list = [('6347_sx',123.98), ('hff_475',234.99), ('sjdh_65',123.67), ('6347_sx',345.12)] 

Próbuję tego, ale nie dało mi to pożądanego wyniku:

norm_file = open("table.txt")

norm_list = []

for norm_line in norm_file.readlines():
    norm_file_elements = norm_line.split()

    x = norm_file_elements[1]
    y = norm_file_elements[2]
    norm_list= [(x,y)]
    print(norm_list)

Wartości y muszą być int. Dziękuję za pomoc.

1
B.T 20 listopad 2019, 10:06
4
Norm_list.append((x,y))
 – 
user2717954
20 listopad 2019, 10:06
1
norm_list = [tuple(line.split()[1:3]) for line in norm_file]
 – 
Robᵩ
20 listopad 2019, 10:26
Chcę, aby wartości y były int. Jak mogę to zrobić?
 – 
B.T
20 listopad 2019, 10:30

3 odpowiedzi

Musisz dołączyć element do listy wewnątrz pętli. W przykładowym kodzie zawsze ustawiasz zmienną na listę pojedynczego elementu, zamiast ją dołączać.

Dlatego zmień swój kod w następujący sposób:

norm_file = open("table.txt")

norm_list = []

for norm_line in norm_file.readlines():
    norm_file_elements = norm_line.split()

    x = norm_file_elements[1]
    y = norm_file_elements[2]
    norm_list.append((x,y))
print(norm_list)
1
Teemu Kurppa 20 listopad 2019, 10:12
Chcę, aby wartości y były int. Jak to uzyskać?
 – 
B.T
20 listopad 2019, 10:26
y = int(norm_file_elements[2])
 – 
Teemu Kurppa
3 grudzień 2019, 21:17

Wypróbuj funkcję zip

To byłoby o wiele łatwe

print(list(zip(norm_file_elements[1], norm_file_elements[2]))
1
Sapan Zaveri 20 listopad 2019, 10:21
Chcę, aby wartości y były int. Jak mogę to zrobić?
 – 
B.T
20 listopad 2019, 10:36
Przekształć go w typ danych int(), taki jak int(norm_file_elements[2])
 – 
Sapan Zaveri
20 listopad 2019, 11:34

Możesz użyć re.findall:

s = """
Nr  Name        Value   F/R
1   6347_sx     123.98  F
2   hff_475     234.99  F
3   sjdh_65     123.67  R
4   6347_sx     345.12  R
"""
d = re.findall('\w+_\w+|\d+\.\d+', s)
result = [(d[i], d[i+1]) for i in range(0, len(d), 2)]

Wynik:

[('6347_sx', '123.98'), ('hff_475', '234.99'), ('sjdh_65', '123.67'), ('6347_sx', '345.12')]

Możesz także użyć re.split przy rozpakowywaniu:

t = list(filter(None, s.split('\n')))
_, *data = [(a, b) for _, a, b, _ in map(lambda x:re.split('\s+', x), t)]

Wynik:

[('6347_sx', '123.98'), ('hff_475', '234.99'), ('sjdh_65', '123.67'), ('6347_sx', '345.12')]
1
Ajax1234 20 listopad 2019, 19:25