Problem:

def detect_monitors_and_modes(preferred_order, binp):
    out = run_xrandr(binp)
    findit = partial(get_mon_mode, preferred_order)
    print 'OUTPUT', '\n'.join(out)
    lst = map(findit, out)
    print 'lst', lst
    matches = filter(lambda x: x, lst)
    print 'matches', matches


OUTPUT Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
   1366x768       60.1*+   40.1
   1360x768       59.8     60.0
   1024x768       60.0
   800x600        60.3     56.2
   640x480        59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

lst [None, 'LVDS1', '1366x768', None, None, None, None, None, None, None, None]
matches ['LVDS1', '1366x768']

W szczególności zastanawiam się, czy jest krótszy / bardziej idiomatyczny sposób na to:

lst = map(findit, out)
matches = filter(lambda x: x, lst)

Oczywiście, nie mogę użyć tylko filter bc powróciłoby całą linię ({x1}}) zamiast wartości zwracanej przez findit. I map zwraca None s dla linii, które nie pasują.

(Czy jest tutaj jakieś użycie dla reduce? Ale ponieważ nie jest koszerne ..)

Edytuj: Chcę tutaj filtrować "falssy" wartości, to jest, puste struny, None s, False i tak dalej, zostaw tylko to, co jest findit.

2
LetMeSOThat4U 5 grudzień 2013, 01:43

2 odpowiedzi

Najlepsza odpowiedź

Chcę tutaj filtrować "falssy" wartości, czyli puste sznurki, nony, fałszywe i tak dalej, zostaw tylko to, co znajdzie się jako pozytywny mecz.

Możesz uprościć:

matches = filter(None, map(findit, out))

Zgodnie z dokumentami:

Jeśli Funkcja jest None, założona jest funkcja tożsamości, czyli wszystkie elementy ireneble są fałszywe, są usuwane.

Na przykład:

3
moooeeeep 4 grudzień 2013, 22:39

Tak, przy użyciu kompymsji listy

matches = [findit(x) for x in out if findit(x) is not None]

To jest sposób "Pythonic", aby to zrobić, jak opisano przez PEP

1
randomusername 4 grudzień 2013, 21:52