сортировка списка кортежей - PullRequest
1 голос
/ 15 июля 2010

У меня есть список кортежей в форме (a, b, c, d), и я хочу скопировать только те кортежи с уникальными значениями 'a' в новый список.Я очень плохо знаком с Python.

Текущая идея, которая не работает:

for (x) in list:
   a,b,c,d=(x)
   if list.count(a)==1:
      newlist.append(x)

Ответы [ 4 ]

3 голосов
/ 15 июля 2010

Если вы не хотите добавить какой-либо из кортежей, которые имеют повторяющиеся значения a (в отличие от добавления первого вхождения данного a, но ни одного из более поздних) :

seen = {}
for x in your_list:
    a,b,c,d = x
    seen.setdefault(a, []).append(x)

newlist = []
for a,x_vals in seen.iteritems():
    if len(x_vals) == 1:
        newlist.append(x_vals[0])
2 голосов
/ 15 июля 2010

Вы можете использовать набор для отслеживания дубликатов:

seen_a = set()
for x in list:
    a, b, c, d = x
    if a not in seen_a:
        newlist.append(x)
        seen_a.add(x)
2 голосов
/ 15 июля 2010
values = {}

for t in tups:
  a,b,c,d = t
  if a not in values:
    values[a] = (1, t)
  else:
    count, tup = values[a]
    values[a] = (count+1, t)

unique_tups = map(lambda v: v[1],
                  filter(lambda k: k[0] == 1, values.values()))

Я использую словарь для хранения a значений и кортежей, которые имеют это a значение.Значение в этом ключе является кортежем (count, tuple), где count - это количество раз, которое a было замечено.

В конце я фильтрую словарь values для только те a значения, где count равен 1, т.е. они уникальны.Затем я отображаю этот список так, чтобы он возвращал только эти кортежи, поскольку значение count будет равно 1.

Теперь unique_tups - это список всех этих кортежей с уникальными a.

Обновлено после получения отзывов от комментаторов, спасибо!

0 голосов
/ 15 июля 2010

вы действительно можете отсортировать список, а затем повторить его:

xs = [(1,2,3,4), (5, 2, 3, 4), (2, 3, 3, 3), (1, 5, 2, 3)]
newList = []
xs.sort()
lastX = None
for x in xs:
  if lastX:
    if lastX[0] == x[0]:
      lastX = None
    else:
      newList.append(lastX)
      lastX = x
if lastX:
  newList.append(lastX)
...