file = open('data.txt') 
data = [] 

h = [i[:-1] for i in file] 

def maximum_cols(list):
    for line in h:
        data.append(line)
y = [int(n) for n in data]

    x = None
    for value in data:
        value = int(value)
        if not x: 
            x = value 
        elif value > x:
            x = value
    return x
maximum_cols(data)
print(data)    

Próbuję więc przeczytać plik na liście 2D, a następnie znajdź wartość maksymalną z listy i wydrukować ją. Jestem taki zagubiony i utknąłem. Nie jestem pewien, jak postępować. Oto kod, który zrobiłem. Jestem pewien, że w moim kodowaniu jest kilka błędów. Jestem nowy w Pythonie i potrzebuję pomocy

Zawartość danych.txt:

13 45 44 98 1 17 4
2 0 1 3 1 1 1

Plik danych

Kodeks; Błędy

0
user7571760 30 czerwiec 2017, 07:45

6 odpowiedzi

Najlepsza odpowiedź

Przepisałem kod w prosty sposób. Spróbuj i zobacz. To działa:

file = open('data.txt') 
data = [] 

data = [i[:-1] for i in file]

def maximum_cols():

    max = 0 
    for line in data:
        x = line.split(' ')
        for num in x:
            if(num > max):
                max = num
    return max

print(maximum_cols())

Użyłem większość zmiennej nazewnictwa. Ale próbowałem tylko sprawić, że będzie krótszy i prostszy do zrozumienia. Czy to czego szukałeś?

EDYTOWAĆ:

file = open('data.txt') 
data = [] 

data = [i[:-1] for i in file]

def maximum_cols():

    max = 0 
    for line in data:
        x = line.split(' ')
        for num in x:
            if(num > max):
                max = num
    for line in data:
        if max in line:
            return line

print(maximum_cols())

Spróbuj zobaczyć, czy dodatkowa dla pętli działa dla Ciebie.

EDYCJA 2:

Wypróbuj to dla nawiasów kwadratowych:

file = open('data.txt') 
data = [i[:] for i in file]

def maximum_cols():
    max = 0 
    for line in data:
        x = line.strip().split(' ')
        for num in x:
            if(int(num) > max):
                max = int(num)
    for line in data:
        if str(max) in line:
            return ('[' + line.strip() + ']')

print(maximum_cols())

Mam nadzieję, że to działa! :)

0
hridayns 30 czerwiec 2017, 06:03

Po prostu użyj heapq, aby zapisać linie, po podziale i odwzorowanie do int. Możesz użyć nlargest, aby wyciągnąć tylko największy wpis, zgodnie z którym zawiera najwyższą wartość.

from heapq import heappush, nlargest

with open('data.txt') as f:
    heap = []
    for line in f:
        heappush(heap, map(int, line.split()))

    print(nlargest(1, heap, key=max)[0])

Wynik:

[13, 45, 44, 98, 1, 17, 4]

Jeśli po prostu chcesz wybrać jedną największą wartość na wszystkich listach (nie jestem pewien, czy to zrobisz), użyj itertools.chain.from_iterable, aby spłaszczyć listę 2D do jednego języka i uzyskaj tego max.

from itertools import chain

with open('data.txt') as f:
    mval = max(chain.from_iterable(map(int,line.split()) for line in f))

    print(mval)
0
Paul Rooney 30 czerwiec 2017, 06:46

Największy problem z istniejącym kodem (oprócz dziwnego wcięcia i trochę nieefektywności) jest to, że nigdy nie podzielasz aktualnego rzędu w cyfry, które mają być używane do porównania.

Co próbujesz osiągnąć stosunkowo prosty - zgodnie z logiką można oddzielić pokolenie listy ładowania plików / 2D i faktycznie znajdując największą wartość na liście:

def get_data(filename):
    with open(filename, "r") as f:  # open the file
        return [list(map(int, x.split())) for x in f]  # generate the 2D integer table

def get_max_value(data):
    return max(max(x) for x in data)  # get maximum value out of all maximums of each row

Następnie możesz przetestować jako:

your_data = get_data("data.txt")  # your 2D list
# e.g. [[13, 45, 44, 98, 1, 17, 4], [2, 0, 1, 3, 1, 1, 1]]
max_value = get_max_value(your_data)  # the maximum value 
# e.g. 98
0
zwer 30 czerwiec 2017, 05:29

Proponowałbym ci znacznie prostsze. Użyj komplicji listy

dane.txt

13 45 44 98 1 17 4
2 0 1 3 1 1 1

wygląd w tym kodzie:

ff = open("data.txt","r+")
flist = ff.readlines()
flist = [item.split() for item in flist]
flist = [int(x) for sub_list in flist for x in sub_list]
print(max(flist))

Wynik:

98

Teraz twoja flist = ff.readlines() właśnie czyta każdą linię i przechowuje każdą linię jako listę. To byłoby wyjście,

['13 45 44 98 1 17 4\n', '2 0 1 3 1 1 1\n']

Teraz pierwszy rozumienie listy,

flist = [item.split() for item in flist]

Powyższa linia dzieli te linie do indywidualnej liczby . Wyjście byłoby to,

[['13', '45', '44', '98', '1', '17', '4'], ['2', '0', '1', '3', '1', '1', '1']]

Ostateczna lista zrozumienia

flist = [int(x) for sub_list in flist for x in sub_list]

Just extends lub łączy wszystkie te elementy na jedną listę i zmienia je do int. To byłoby wyjście,

[13, 45, 44, 98, 1, 17, 4, 2, 0, 1, 3, 1, 1, 1]

Wreszcie wystarczy użyć wbudowanego max() funkcji, aby uzyskać maksymalną listę.

max(flist)

Zobacz, jak to jest proste. Jednak jeśli chcesz rozwiązać problem w konkretnym kodzie, spójrz na inne solultonom. Właśnie wspomniałem o tym, że znacznie prostszy sposób

0
void 30 czerwiec 2017, 05:26

Możesz to zrobić

    data = [] 
    with open('pytext.txt','rb') as f:
        line = f.read().splitlines()

    for i in line:
        data =  i.split(' ')
        str_list = map(lambda x: x.strip(), data)
        mylist =   [int(i) for i in str_list if i]
        print max(mylist)
0
Somil 30 czerwiec 2017, 05:21

Przede wszystkim, kiedy dzwonisz maximum_cols(data), robiąc to bez zmiennej, a później wydrukujesz tę samą data, która jest lista 2D, więc nawet drukujesz max.

Po drugie, masz problemy z uzyskaniem listy z pliku, musisz najpierw podzielić każdą linię.

myfile = open('data.txt') # don't use the word file as a variable
data = [line.rstrip().split() for line in myfile]
myfile.close() # very important to close files after we use them

Z rstrip() Dostajemy wszystkie linie bez znaków Newline i bez brzydkiego z [: -1], co jest nieczytelne i bardzo łamliwe (RSSTRip jest tylko dla tego), a następnie split() Linie, aby uzyskać każdy element

Zauważ, że data jest teraz już liście 2-D, której chciałeś, ale nadal sznurki, a nie liczby całkowite, teraz możemy wydostać maksymalną wartość z wbudowaną funkcją MAX i z jakimś fantazyjnym rozumieniem listy, można to zrobić za pomocą jednego Funkcja linii:

def max2d(data):
    return max(int(x) for line in data for x in line)

Następnie wystarczy użyć tej funkcji i wydrukować wyjście:

mymax = max2d(data)
print(mymax)

Wszystko razem:

myfile = open('data.txt') # don't use the word file as a variable
data = [line.rstrip().split() for line in myfile]
myfile.close() # very important to close files after we use them

def max2d(data):
    return max(int(x) for line in data for x in line)

mymax = max2d(data)
print(mymax)

Jak widać, pozwolę sobie przebić się z twojego stylu, ponieważ myślałem, że lepiej byłoby nauczyć się bardziej "Pythonic" sposobu na to ... Mam nadzieję, że to pomoże

0
Ofer Sadan 30 czerwiec 2017, 05:21