Добавление строк в список - PullRequest
1 голос
/ 01 июля 2011

Вопрос новичка здесь.

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

import itertools 

mydata = [ ]

main = [["car insurance", "auto insurance"], ["insurance"], ["cheap", "budget"],
      ["low cost"], ["quote", "quotes"], ["rate", "rates"], ["comparison"]]

def twofunc(one, two):
    for a, b in itertools.product(main[one], main[two]):
        print a, b

def threefunc(one, two, three):
    for a, b, c in itertools.product(main[one], main[two], main[three]):
        print a, b, c

twofunc(2, 0)  #extremely inefficient to just run these functions over and over. alternative?
twofunc(3, 0)
twofunc(0, 4)
twofunc(0, 5)
twofunc(0, 6)
threefunc(2, 0, 4)
threefunc(3, 0, 4)
threefunc(2, 0, 5)
threefunc(3, 0, 5)
threefunc(2, 0, 6)
threefunc(3, 0, 6)

Приведенный выше код простораспечатывает каждую перестановку, но не добавляет значения в список.Я пробовал различные варианты метода добавления, но все еще не повезло.

Может кто-нибудь помочь мне с размещением этих значений в списке mydata.Я предполагаю, что каждая строка должна быть отдельным списком, поэтому в конечном итоге это будет список списков.Это должно выглядеть следующим образом, но мне также понадобится какой-то способ включить «теги» в будущем или просто значения, если строка содержит значение.

[["cheap car insurance"],
["cheap auto insurance"],
["budget car insurance"],
["budget auto insurance"],
["low cost car insurance"],
["low cost auto insurance"],
...

, поэтому, в конце концов, закончитсяup: 1 означает, что в строках содержится слово car / cheap, а 0 означает, что его нет.Причина, по которой я упоминаю это, состоит в том, чтобы просто узнать, является ли список подходящей структурой данных для этой задачи.

                         car        cheap 
cheap car insurance       1            1
cheap auto insurance      0            1 
budget car insurance      1            0
budget auto insurance     0            0

Может кто-нибудь помочь.

Я выполнил эту задачу в R,довольно поддается этой задаче, и просто хотел воспроизвести ее на Python.

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Чтобы получить return значения twofunc и threefunc в list , вы можете изменить операторы return, чтобы списки возвращались.Затем добавьте результат к mydata.Вот пример для twofunc:

def twofunc(one, two):
    for a, b in itertools.product(main[one], main[two]):
        return [a, b]

mydata.append(twofunc(2,0))

Тем не менее, я не знаком с R, поэтому, очевидно, не знаю, какую структуру данных вы там используете.Для вашей заявленной цели держать это в списке может быть сложно.Тем не менее, создание простого класса для этого не должно быть слишком сложным.После этого вы можете составить список экземпляров этого класса.

1 голос
/ 01 июля 2011

Во-первых, вам не нужно писать по отдельности twofunc и threefunc:

def nfunc(strings, indices):
    """call as nfunc(main,(2,0)) or nfunc(main, (2,0,4))"""
    selected_strings=map(lambda index:strings[index], indices)
    return itertools.product(*selected_strings)

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

Теперьмы можем разделить список индексов из императивного кода как список, как вы сделали со строками, так что вам не нужно переписывать вызовы каких-либо функций для изменения индексов:

index_list=[(2, 0),(3, 0),...,(2, 0, 4),(3, 0, 4),...,(3, 0, 6)]

Toпросто получите список ленивых результатов, теперь вы можете написать:

lazy_results=[nfunc(main, indices) for indices in index_list]
-> [itertools.product at 0xblahblah, itertools.product at 0xblahblah, ...]

, чтобы форсировать оценку результатов:

eager_results=[list(lazy) for lazy in lazy_results]
-> [[("cheap","car insurance"),("budget","car insurance"), ...

, чтобы сгладить кортежи в строки:

str_results=[[' '.join(rtuple) for rtuple in result] for result in eager_results]
-> [["cheap car insurance", "budget car insurance", ...

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

tag_index_list=[(tag_1,(2,0)), ... (tag_n, (3, 0, 6))]
tag_results=[(tag, nfunc(main, indices)) for (tag, indices) in tag_index_list]

В зависимости от того, что вам нужно сделать, может лучше написать класс для вашего результатаустановить вместо;если вы пройдете через приведенный выше код, вы почувствуете, как будет выглядеть использование вложенных списков и кортежей.

1 голос
/ 01 июля 2011
main = [["car", "auto"], ["insurance"],["cheap", "budget"]]

reduce(lambda x,y: [e+' '+f for e,f in itertools.product(x,y)],main)

или

reduce(lambda x,y: [' '.join([e,f]) for e,f in itertools.product(x,y)],main)

последний должен быть быстрее
результат:

['car insurance cheap', 'car insurance budget', 'auto insurance cheap', 'auto insurance budget']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...