2013-07-12 2 views
0

У меня есть код на Python, который удаляет строки, если они похожи при обратном. Например, если у меня есть документ, который содержит:скрипт python для удаления обратных повторяющихся строк

1,2 3,4 
5,6 7,8 
2,1 4,3 
5,6 8,7 

После выполнения сценария, выход

5,6 7,8 
2,1 4,3 
5,6 8,7 

Рассмотрим первый столбец 1,2 и второй столбец 7,8 для линии, то , если другая строка содержит обратные значения для каждого столбца как 2,1 и 8,7, это считается обратным.

Однако я заметил, что сценарий не поддерживает порядок строк. Порядок строк важен для меня. Кроме того, мне нужно удалить вторую аналогичную обратную линию, а не первую. Код

import sys 

with open(sys.argv[1]) as inf: 

    keys = set() 

    for line in inf: 

     ports, ips = line.split() 

     port1, port2 = ports.split(",") 

     ip1, ip2 = ips.split(",") 

     if ip1 < ip2: 

      keys.add((ip1, port1, ip2, port2)) 

     else: 

      keys.add((ip2, port2, ip1, port1)) 

with open('results', 'w') as outf: 

    for result in keys: 

     outf.write("{1},{3}\t{0},{2}\n".format(*result)) 

Любые идеи? Любое предложение, если мы сможем сделать это на скриптах bash?

Благодаря

+0

ли '1,2 7,8' и' 7, 8 1,2' эквивалент? – jterrace

+0

Это не похоже на какое-либо определение «обратного», которое я когда-либо видел. Какую проблему вы пытаетесь решить? Зачем вам этот сценарий? – user2357112

+0

no.consider Первый столбец равен 1,2, а второй столбец - 7,8 для строки a, тогда если другая строка содержит обратные значения для каждого столбца как 2,1 и 8,7, это считается обратным. – user2566898

ответ

2

Вы можете использовать collections.OrderedDict здесь:

>>> from collections import OrderedDict 
>>> dic = OrderedDict() 
with open('file.txt') as f: 
    for line in f: 
     key = tuple(tuple(x.split(',')) for x in line.split()) 
     rev_key = tuple(x[::-1] for x in key) 
     if key not in dic and rev_key not in dic: 
      dic[key] = line.strip() 
...    
>>> for v in dic.itervalues(): 
    print v 
...  
1,2 3,4 
5,6 7,8 
5,6 8,7 
+0

Ashwini большое спасибо. Полностью сработал :) – user2566898

1

Поскольку вы упомянули bash, вот awk решение

awk -F'[ ,]' 'BEGIN{OFS=","} {$1=$1}; 
!($0 in arr){print($1,$2" "$3,$4);arr[$2","$1","$4","$3]}' file.txt 

1,2 3,4 
5,6 7,8 
5,6 8,7 
+1

+1 Это приятно. Всегда приятно видеть, что 'awk' все еще способен оспаривать' python'. –

+0

@JS 웃, спасибо! Это решения от вас самих, Кент, Гленн Джекман и др., Которые открыли мне глаза на силу awk. – iruvar

Смежные вопросы