En una lista

[
[[ 979, 2136, 3427, 2221]],

 [[1497,  697, 2843,  721]],

 [[2778, 2194, 3903, 2233]],
]

Iterada como tal

for line in lines:
    for x1, y1, x2, y2 in line:

Me gustaría encontrar el valor máximo de (x1 o x2, lo que sea máximo) y (y1 y2, lo que sea máximo)

0
Damien 25 jun. 2020 a las 19:59

4 respuestas

La mejor respuesta

Puede hacer esto:

[*map(lambda x: list(map(max, [x[0][:2], x[0][2:]])), mylist)]
[[2136, 3427], [1497, 2843], [2778, 3903]]
1
Nicolas Gervais 25 jun. 2020 a las 17:07
import sys
max_x, max_y = [-sys.maxsize,-sys.maxsize]
lines = [
          [[979,2136,3427,2221]],
    
          [[1497,697,2843,721]],
            
          [[2778,2194,3903,2233]]
]
for line in lines:
     for x1, y1, x2, y2 in line:
         if max(x1,x2) > max_x:
             max_x = max(x1,x2)
         if max(y1,y2) > max_y:
             max_y = max(y1,y2)

Si sus puntos solo tienen valores positivos, puede inicializar max_x y max_y a 0.

0
C. Celora 25 jun. 2020 a las 17:13

A continuación se explica cómo encontrar el máximo de cada conjunto:

ls1 = [[[ 979, 2136, 3427, 2221]],
       [[1497,  697, 2843,  721]],
       [[2778, 2194, 3903, 2233]]]

ls2 = [[max(a[0][:2]),
        max(a[0][2:])]
       for a in ls1]

print(ls2)

Salida:

[[2136, 3427],
 [1497, 2843],
 [2778, 3903]]


Para encontrar el máximo de todos los x y y:

ls1 = [[[ 979, 2136, 3427, 2221]],
       [[1497,  697, 2843,  721]],
       [[2778, 2194, 3903, 2233]]]

x = max([i for j in [a[0][:2] for a in ls1] for i in j])
y = max([i for j in [a[0][2:] for a in ls1] for i in j])

print(x, y)

Salida:

2778 3903
0
Ann Zen 6 jul. 2020 a las 14:21

Preferiría una versión más detallada (pero también argumentaría más legible) de la respuesta de Nicolas que conserva los bucles for y usa una tupla con nombre para una salida más significativa:

from collections import namedtuple

Coordinate = namedtuple('Coordinate', ['x', 'y'])

lines = [[[ 979, 2136, 3427, 2221]], [[1497,  697, 2843,  721]], [[2778, 2194, 3903, 2233]]]

maximums = []

for line in lines:
    for x1, y1, x2, y2 in line:
        maximums.append(Coordinate(x=max(x1, x2), y=max(y1, y2)))

print(maximums)
# prints [Coordinate(x=3427, y=2221), Coordinate(x=2843, y=721), Coordinate(x=3903, y=2233)]
print([Coordinate(x=3427, y=2221), Coordinate(x=2843, y=721), Coordinate(x=3903, y=2233)])
# prints [(3427, 2221), (2843, 721), (3903, 2233)]
0
Kellen 25 jun. 2020 a las 17:20