Слияние содержимого двух списков на основе цикла if - PullRequest
2 голосов
/ 24 марта 2010

У меня небольшая проблема при проверке элементов в списке: У меня есть два файла с содержимым что-то вроде этого

file 1:        file2:
 47            358 47
 48            450 49
 49            56 50

Я разбил оба файла на два списка и использовал следующий код для проверки

for i in file_1:
   for j in file_2:
      j = j.split()
      if i == j[1]:
        x=' '.join(j)
        print >> write_in, x

Я сейчас пытаюсь получить «0», если значение file_1 отсутствует в file_2, например, значение «48» отсутствует file_2, поэтому мне нужно получить вывод как (с одним пробелом два числа) Также оба условия должны создавать только один выходной файл:

output_file:
  358 47
   0 48
  450 49
   56 50

Я пытался использовать словарный подход, но я не совсем понял, что хотел (на самом деле я не знаю, как правильно использовать словарь в python;)). Любая помощь будет отличной.

Ответы [ 5 ]

2 голосов
/ 24 марта 2010
r1=open('file1').read().split()
r2=open('file2').read().split()

d=dict(zip(r2[1::2],r2[::2]))

output='\n'.join(x in d and d[x]+' '+x or '0 '+x for x in r1)

open('output_file','wb').write(output)

Test

>>> file1='47\n48\n49\n50'
>>> file2='358 47\n450 49\n56 50'
>>>
>>> r1=file1.split()
>>> r2=file2.split()
>>>
>>> d=dict(zip(r2[1::2],r2[::2])) #
>>> d
{'47': '358', '50': '56', '49': '450'}
>>>
>>> print '\n'.join(x in d and d[x]+' '+x or '0 '+x for x in r1)
358 47
0 48
450 49
56 50
>>>
1 голос
/ 24 марта 2010

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

d = {}
for k in file1:
    d[k] = 0
for line in file2:
    v, k = line.split()
    d[k] = v
for k in sorted(d):
    print d[k], k
1 голос
/ 24 марта 2010

Вы можете довольно легко изменить свой код:

for i in file_1:
    x = None
    for j in file_2:
        j = j.split()
        if i == j[1]:
            x = ' '.join(j)
    if x is None:
        x = ' '.join(['0', i])

В зависимости от ваших вводных данных вся задача, конечно, может быть еще более упрощена. На данный момент ваш код 0(n**2) сложность.

0 голосов
/ 27 марта 2010
def file_process(filename1, filename2):

    # read first file with zeroes as values
    with open(filename1) as fp:
        adict= dict( (line.rstrip(), 0) for line in fp)

    # read second file as "value key"
    with open(filename2) as fp:
        adict.update(
            line.rstrip().partition(" ")[2::-2] # tricky, read notes
            for line in fp)
    for key in sorted(adict):
        yield adict[key], key

fp= open("output_file", "w")
fp.writelines("%s %s\n" % items for items in file_process("file1", "file2"))
fp.close()

str.partition ("") возвращает кортеж (pre-space, space, post-space). Разрезая кортеж, начиная с пункта 2 (после пробела) и двигаясь с шагом -2, мы возвращаем кортеж (пост-пробел, пробел), которые (ключ, значение) для словаря, решение.

PS Гм :) Я только что заметил, что мой ответ по сути такой же, как и у Даниеля Штутцбаха.

0 голосов
/ 25 марта 2010

Вы можете попробовать что-то вроде:

l1 = open('file1').read().split()
l2 = [line.split() for line in open('file2')]

for x, y in zip(l1, l2):
    if x not in y:
        print 0, x
    print ' '.join(y)

но если вы следуете своей логике, вывод должен быть

358 47
0 48
450 49
0 49
56 50

а не

358 47
0 48
450 49
56 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...