The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Python. Сравнение строк."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Python)
Изначальное сообщение [ Отслеживать ]

"Python. Сравнение строк."  +/
Сообщение от name (??) on 27-Фев-13, 11:19 
Основная задача: поиск и склеивание строк с одинаковыми значениями в определенных столбцах.
Есть два файла - 1.txt(содержит 4 строки) и 2.txt(3 строки) со следующим содержанием:

1.txt:
------
453 3
768 1
543 2
123 4
------

2.txt:
------
4 321
3 354
1 867
------

И есть скрипт:
------
file1 = open('1.txt', encoding='utf-8')
file2 = open('2.txt', encoding='utf-8')


for f1_lines in file1:
    f1_line=f1_lines.split()
    print(f1_line)
    for f2_lines in file2:
        f2_line=f2_lines.split()
        if f1_line[1] == f2_line[0]:
            print(f1_line[0], f1_line[1], f2_line[0], f2_line[1])
------

Вот его вывод:
------
['453', '3']
453 3 3 354
['768', '1']
['543', '2']
['123', '4']
------

Вот вывод который мне нужен:
------
['453', '3']
453 3 3 354
['768', '1']
768 1 1 867
['543', '2']
['123', '4']
123 4 4 321
------
Как я понял встроенный цикл for скрипт запускает только 1 раз.

Если можно сделать элегантней - буду только рад узнать как. Спасибо.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Python. Сравнение строк."  +/
Сообщение от Andrey Mitrofanov on 27-Фев-13, 16:51 
> Если можно сделать элегантней - буду только рад узнать как. Спасибо.

Уан-лайнер возьмёшь? B)

$ cat_data1
453 3
768 1
543 2
123 4
$ cat_data2
4 321
3 354
1 867
$ join -1 2 -2 1 <(cat_data1|sort -k2,2) <(cat_data2|sort -k1,1)
1 768 867
3 453 354
4 123 321
$ _

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Python. Сравнение строк."  +/
Сообщение от name (??) on 27-Фев-13, 21:35 
>[оверквотинг удален]
> 123 4
> $ cat_data2
> 4 321
> 3 354
> 1 867
> $ join -1 2 -2 1 <(cat_data1|sort -k2,2) <(cat_data2|sort -k1,1)
> 1 768 867
> 3 453 354
> 4 123 321
> $ _

Я знаю как это сделать в sh. Мне нужно на Python. Но все равно спасибо за ответ. Проблема не решена.

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Python. Сравнение строк."  +/
Сообщение от name (??) on 28-Фев-13, 11:03 
Уверен что можно сделать куда проще, но функцию выполняет:
------
file1 = open('1.txt', encoding='utf-8')
file2 = open('2.txt', encoding='utf-8')

f1_array=[]
f2_array=[]

for f1_lines in file1:
    f1_line=f1_lines.split()
    f1_array.append(f1_line)

for f2_lines in file2:
    f2_line=f2_lines.split()
    f2_array.append(f2_line)

for x in f1_array:
    for y in f2_array:
        if x[1] == y[0]:
            print(x[0], x[1], y[0], y[1])
------

Если кто знает(и кому не лень) как написать лучше - пишем.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "Python. Сравнение строк."  +/
Сообщение от Аноним (??) on 28-Фев-13, 21:00 

> Если кто знает(и кому не лень) как написать лучше - пишем.

С первого взгляда, разве что, можно убрать два избыточных цикла

file1 = open('1.txt')
file2 = open('2.txt')

f1_array=[]

for f1_lines in file1:
    f1_line=f1_lines.split()
    f1_array.append(f1_line)

for f2_lines in file2:
    f2_line=f2_lines.split()
    for x in f1_array:
        if f2_line[0] == x[1]:
            print(x[0], x[1], f2_line[0], f2_line[1])

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Python. Сравнение строк."  +/
Сообщение от Аноним (??) on 11-Апр-13, 09:27 
row1 = [line.strip().split() for line in open('1.txt') if line]
row2 = [line.strip().split() for line in open('2.txt') if line]
for pair1 in row1:
    print(pair1)
    x = filter(lambda p2: pair1[1] == p2[0], row2)
    x = [rec for pair in x for rec in pair]
    print(' '.join(pair1), ' '.join(x)) if x else None
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Python. Сравнение строк."  +/
Сообщение от Аноним (??) on 02-Мрт-13, 08:38 
> Как я понял встроенный цикл for скрипт запускает только 1 раз.
> Если можно сделать элегантней - буду только рад узнать как. Спасибо.

Если для файлов из 3-х строк - юзай массивы.
Если в файлах будут гигозы:


> file1 = open('1.txt', encoding='utf-8')
> for f1_lines in file1:
>  f1_line=f1_lines.split()
>  print(f1_line)
>> file2 = open('2.txt', encoding='utf-8')
>  for f2_lines in file2:
>   f2_line=f2_lines.split()
>   if f1_line[1] == f2_line[0]:
>    print(f1_line[0], f1_line[1], f2_line[0], f2_line[1])
>> close(file2)

Ну за синтаксис не отвечу - но идея понятна надеюсь :)

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру