Chcę znać najkrótszy sposób na napisanie następujących

 res=[]
 for x in xrange(1,4):
     if x in [1,3]:
            res.append(1)
     else:
           res.append(0)

Moim rzeczywistym problemem jest przekształcenie wejścia, takiego jak [4,6] w [0,0,0,1,0,1], gdzie używam na przykład Xrange (1,7) na przykład

-2
sarath joseph 16 sierpień 2014, 02:17

5 odpowiedzi

Najlepsza odpowiedź

Korzystanie ze zrozumienia list:

res = [int(x in (1, 3)) for x in xrange(1, 4)]

Który wykorzystuje fakt, że bool jest podklasą int.

Krótszy oczywiście jest:

res = [1, 0, 1]
4
Martijn Pieters 15 sierpień 2014, 22:19

Tak krótki jak się da.

res = [1, 0, 1]
2
Kevin London 15 sierpień 2014, 22:20

Myślę, że szukasz czegoś takiego:

print [int(x in [4, 6]) for x in range(1, 7)]

Wynik:

[0, 0, 0, 1, 0, 1]
2
Falko 15 sierpień 2014, 22:28

Oto jak to zrobił, z wbudowanymi dokoketami:

def bit_array(series, matches):
    """
    >>> bit_array(range(1, 7), (4, 6))
    [0, 0, 0, 1, 0, 1]
    >>> bit_array(range(1, 4), (1, 3))
    [1, 0, 1]
    """
    return [int(x in set(matches)) for x in series]

if __name__ == '__main__':
    from doctest import testmod
    testmod()

Nie sądzę, że jest to najkrótszy, ponieważ jest to funkcja z parametrami i ma infrastrukturę testową jednostką, ale myślę, że jest najcięższy w reprezentowaniu jego celu. I zawsze możesz inline funkcję i wyrzucić testy po przekonaniu, że działa.

2
hughdbrown 15 sierpień 2014, 23:00

To jest inny sposób:

>>> [0 if i % 2 == 0 else 1 for i in range(1, 4)]
[1, 0, 1]
0
shaktimaan 15 sierpień 2014, 22:22