Сравнение списка строк со списком строк (python) - PullRequest
1 голос
/ 06 января 2012

Я пытаюсь сравнить два документа Excel друг с другом, они состоят из примерно 6000 строк и 4 столбцов, первый столбец - это доменное имя, остальные три - комментарии, один из документов обновил комментарии внекоторые столбцы, и в конечном итоге мне бы хотелось, чтобы этот скрипт функционировал как пакетное обновление новых комментариев, заменяя старые устаревшие.

Код, который я написал до сих пор, открывает документы и добавляет их в два отдельных списка:

import csv

newlist = csv.reader(open('newcomments.csv','rU'), dialect='excel')
export = csv.reader(open('oldcomments.csv', 'rU'), dialect='excel')

for row in newlist:
    olddomain=[]
    domain = row[0:]
    olddomain.append(domain)
    for item in olddomain:
        print item

    for row in export:
        newdomain=[]
        domain= row[0:]
        newdomain.append(domain)
        for item in newdomain:
            print item

вывод из списков выглядит так (второй столбец обычно пуст):

['example.com', '', 'excomment', 'Parked Page']

При попытке сравнить списки я пробовал что-то вроде:

if item in olddomain != item in newdomain:
                    print "no match"
                else:
                    print "match"

но это, похоже, не работает, например, первая строка в двух файлах содержит одни и те же данные, но код возвращает «нет совпадения», вторая строка в обоих файлах также содержит одинаковые данные, но код возвращает "match"

Проблема в том, как я сохраняю строки в списке, или я что-то упускаю?Я собираюсь предположить, что есть лучший способ сделать это, но я использую его в качестве предлога, чтобы узнать больше Python!

Спасибо за ваше время.

Ответы [ 3 ]

7 голосов
/ 06 января 2012

Похоже, вы пытаетесь сравнить старый список доменных имен с новым списком доменных имен.После того, как эти списки были построены, вы хотите увидеть, есть ли общность между списками.

В этом случае, я думаю, set() предлагает гораздо более богатые функциональные возможности, которые делают вашу жизнь проще,Пример:

>>> olddomains = set(['www.cisco.com', 'www.juniper.com', 'www.hp.com'])
>>> newdomains = set(['www.microsoft.com', 'www.cisco.com', 'www.apple.com'])
>>> olddomains.intersection(newdomains)
set(['www.cisco.com'])
>>>
>>> 'www.google.com' in newdomains
False
>>>

Переписывание части вашего кода для использования набора будет выглядеть так:

# retain newlist, since that's the output from csv...
for row in newlist:
    olddomain = set([])
    domain = row[0]
    olddomain.add(domain.lower())   # use lower() to ensure no CAPS mess things up
    for item in olddomain:
        print item

И код, о котором вы спрашивали:

if olddomain.intersection(newdomain) == set([]):
                    print "no match"
                else:
                    print "match"

Общее правило, которое я использую при определении, использую ли я set() или list():

  • Если сохранение порядка элементов имеет значение (включая возможность доступа к ним с помощью индекса),используйте list()
  • В любом другом случае используйте set()

РЕДАКТИРОВАТЬ

СВы спрашиваете, почему код, который я разместил, выдает TypeError, если вы присваиваете row таким же образом, как я, тогда вам нужно использовать row[0] вместо row[0:]

>>> row = ['example.com', '', 'excomment', 'Parked Page']
>>> row[0:]
['example.com', '', 'excomment', 'Parked Page']
>>> row[0]
'example.com'
>>> 

Я изменил свой пример, чтобы отразить это, так как подозреваю, что именно в этом заключается проблема.

3 голосов
/ 06 января 2012

Скорее всего, вам просто не хватает паратезов.Обратите внимание, что следующие две строки равны, потому что операторы предшествуют из in и != равны:

if   item in olddomain  != item in newdomain:
if ((item in olddomain) != item) in newdomain:

Возможно, вы хотите:

if (item in olddomain) != (item in newdomain):
0 голосов
/ 01 июня 2015

Попробуй сделать это набором, делай и работай.

Пример:

В [1]: a = ['a', 'b', 'c']

В [2]: b = ['b', 'a', 'c']

В [3]: установить (a) и установить (b)

Out [3]: {'a', 'b', 'c'}

В [4]: ​​set (b) == set (a) и set (b)

Out [4]: ​​True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...