2015-04-26 2 views
1

Скажут, у меня есть списокКак удалить кортеж в списке в списке:

dist= [[(0.0, 1.0)], [(20.0, 0.8563799085248148)], [(40.0, 0.8371216462519347)], [(60.0, 0.9282032302755089)], [(80.0, 7.8429970322236064), (80.0, 1.2045483557883576)], [(100.0, 3.753460385470896), (100.0, 2.070863609380179)], [(120.0, 2.6794919243112276), (120.0, 12.92820323027545)], [(140.0, 2.298981118867903)], [(160.0, 2.250827351906659)], [(180.0, 2.4999999999999996), (180.0, 6.000000000000004)], [(200.0, 3.2523178818773006), (200.0, 3.0522653889161626)], [(220.0, 5.622391569468206), (220.0, 2.226834844885431)], [(240.0, 37.32050807568848), (240.0, 1.9366857335569074)], [(260.0, 1.9181147622136665)], [(280.0, 2.1576718089133085)], [(300.0, 2.85976265663383)], [(320.0, 2.9627929206431776), (320.0, 5.162096782237789)], [(340.0, 1.4051274947736847), (340.0, 69.47032761621178)]] 

Обратите внимание, что у меня есть некоторые элементы в списке, которые разделяют первый элемент (Извините за неправильную терминологию). Например , dist[4] - [(80.0, 7.8429970322236064), (80.0, 1.2045483557883576)]; и 80 находится в обоих кортежах.

Теперь я хочу удалить кортеж, чей элемент tup[1] больше. Таким образом, в этом случае, я хочу удалить (80.0, 7.8429970322236064) потому 7.84299 ... больше чем 1.20454 ....

После того, как процесс будет завершен, dist[4] будет только [(80.0, 1.2045483557883576)]

Я пытался что-то вроде этого

for e in range(len(dist)): 
    if len(dist[e]) >= 2: 
      for f in range(len(dist[e])): 
       del max(dist[e][f]) 

Но он возвращает это:

>SyntaxError: can't delete function call 
+1

'макс (расстояние [е] [е])' является поплавок, где вы проверка общих первых элементов? –

+0

На основании ввода, похоже, он забыл упомянуть, что, когда кортежи были вместе в подсписке, они имеют тот же самый первый элемент. – Brionius

+0

Можете ли вы уточнить - должны ли кортежи удаляться только в том случае, если они имеют общий первый элемент? Или они всегда будут иметь общий первый элемент, если они находятся во внутреннем списке вместе? – DNA

ответ

1
[[min(l)] for l in dist] 

делает работу, потому что мин отлично работает на кортежах: (80,1)<(80,2).

+0

Также хорошо работает. –

+0

Это сравнивает каждый элемент, а не только второй, который имел бы большое значение, если подсписчики были большими –

+0

Я думаю, что это ленивая оценка. Кажется, что быстрее, чем вызов itemgetter: % timeit [[min (l, key = itemgetter (1))] для l in dist] -> 22.7 мкс; % timeit [[min (l)] для l в dist] -> 9,62 мкс –

1

Import operator поставить функцию сравнения для минимум

>>> from operator import itemgetter 

Итерация по списку и для каждого элемента, который является также список, получить минимум его в соответствии со вторым элементом.

>>> [min(e, key=itemgetter(1)) for e in dist] 
+0

Спасибо. Можете ли вы объяснить больше, что это делает; может быть, даже пройти через пример? –

+0

@DNA Нет ли там 2 '(' before it и one ')' перед этим тоже? –

+0

Это исправлено сейчас ;-) – DNA

1
dist= [[(0.0, 1.0)], [(20.0, 0.8563799085248148)], [(40.0, 0.8371216462519347)], [(60.0, 0.9282032302755089)], [(80.0, 7.8429970322236064), (80.0, 1.2045483557883576)], [(100.0, 3.753460385470896), (100.0, 2.070863609380179)], [(120.0, 2.6794919243112276), (120.0, 12.92820323027545)], [(140.0, 2.298981118867903)], [(160.0, 2.250827351906659)], [(180.0, 2.4999999999999996), (180.0, 6.000000000000004)], [(200.0, 3.2523178818773006), (200.0, 3.0522653889161626)], [(220.0, 5.622391569468206), (220.0, 2.226834844885431)], [(240.0, 37.32050807568848), (240.0, 1.9366857335569074)], [(260.0, 1.9181147622136665)], [(280.0, 2.1576718089133085)], [(300.0, 2.85976265663383)], [(320.0, 2.9627929206431776), (320.0, 5.162096782237789)], [(340.0, 1.4051274947736847), (340.0, 69.47032761621178)]] 
from operator import itemgetter 
for sub in dist: 
    if len(sub) > 1: 
     mx = max(sub,key=itemgetter(1)) 
     sub.remove(mx) 

from pprint import pprint as pp 

pp(dist) 

[[(0.0, 1.0)], 
[(20.0, 0.8563799085248148)], 
[(40.0, 0.8371216462519347)], 
[(60.0, 0.9282032302755089)], 
[(80.0, 1.2045483557883576)], 
[(100.0, 2.070863609380179)], 
[(120.0, 2.6794919243112276)], 
[(140.0, 2.298981118867903)], 
[(160.0, 2.250827351906659)], 
[(180.0, 2.4999999999999996)], 
[(200.0, 3.0522653889161626)], 
[(220.0, 2.226834844885431)], 
[(240.0, 1.9366857335569074)], 
[(260.0, 1.9181147622136665)], 
[(280.0, 2.1576718089133085)], 
[(300.0, 2.85976265663383)], 
[(320.0, 2.9627929206431776)], 
[(340.0, 1.4051274947736847)]] 
+0

Это не сработало, по крайней мере, для линии 120.0 и строки 340.0 , Спасибо за вашу помощь. :) –

+0

@FredBarclay, я передал неправильный ключ, код работает, являются ли первые элементы всегда одинаковыми, когда у вас есть пары кортежей? –

+0

1. Работает код! Я чувствую себя глупо. :) 2. Да, первый элемент всегда будет одним и тем же. Это исследует расстояние между точкой пересечения луча с линией (сортировкой) и точкой в ​​источнике луча. Угол луча является первым элементом множества, и иногда один и тот же луч пересекает 2 линии (так что угол луча будет одним и тем же, но расстояние будет иным). Когда это происходит, мне нужен только ближайший расстояние. –

-1

Вот решение с использованием reduce:

dist= [[(0.0, 1.0)], [(20.0, 0.8563799085248148)], [(40.0, 0.8371216462519347)], [(60.0, 0.9282032302755089)], [(80.0, 7.8429970322236064), (80.0, 1.2045483557883576)], [(100.0, 3.753460385470896), (100.0, 2.070863609380179)], [(120.0, 2.6794919243112276), (120.0, 12.92820323027545)], [(140.0, 2.298981118867903)], [(160.0, 2.250827351906659)], [(180.0, 2.4999999999999996), (180.0, 6.000000000000004)], [(200.0, 3.2523178818773006), (200.0, 3.0522653889161626)], [(220.0, 5.622391569468206), (220.0, 2.226834844885431)], [(240.0, 37.32050807568848), (240.0, 1.9366857335569074)], [(260.0, 1.9181147622136665)], [(280.0, 2.1576718089133085)], [(300.0, 2.85976265663383)], [(320.0, 2.9627929206431776), (320.0, 5.162096782237789)], [(340.0, 1.4051274947736847), (340.0, 69.47032761621178)]] 

dist_reduced = [reduce(lambda a, b: a if a[1]>b[1] else b, elements) for elements in dist] 

print dist_reduced 

>> [(0.0, 1.0), (20.0, 0.8563799085248148), (40.0, 0.8371216462519347), (60.0, 0.9282032302755089), (80.0, 7.8429970322236064), (100.0, 3.753460385470896), (120.0, 12.92820323027545), (140.0, 2.298981118867903), (160.0, 2.250827351906659), (180.0, 6.000000000000004), (200.0, 3.2523178818773006), (220.0, 5.622391569468206), (240.0, 37.32050807568848), (260.0, 1.9181147622136665), (280.0, 2.1576718089133085), (300.0, 2.85976265663383), (320.0, 5.162096782237789), (340.0, 69.47032761621178)] 
+0

'cond? t: f' недействителен Python. Вы ищете 't if cond else f'. – Navith

+0

@Navith Ой, думал, я уже это исправил. – Brionius

+0

Не работает для линии 80.0. Хм ... –

0

с глубокой итерацию :)

for pairs in dist: 
    if len(pairs)>1: 
      for tuples in pairs: 
        if sum(tuples[0])>sum(tuples[1]): 
         tuples.remove(tuples[0]) 
        else: 
         tuples.remove(tuples[1])