Добавить определенные столбцы в один список строк (может быть немного базовым) - PullRequest
1 голос
/ 18 мая 2011

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

Вот краткое изложение: IУ меня есть список со строкой

myString = "Hey what's up?"
myString2DList = [
    myString,
    ]

Теперь у меня есть 2D-список с одной строкой.Все, что я хочу сделать, это добавить столбцы (могут быть сами списки) в указанный пользователем индекс

Таким образом, можно сказать, что 3 индекса (которые соответствуют столбцу), такие как: 0,4,6 (H, ш, а) и теперь я просто хочу динамически добавлять что-либо к этим столбцам.Я выполнил поиск и не очень помог (я видел несколько многообещающих постов, в которых упоминалось, что тип данных Dict может быть лучше использовать здесь), и я чувствую себя полностью застрявшим ...

Редактировать / уточнить:

По сути, первая строка будет представлять пароль, который пользователь хочет восстановить.Допустим, пользователь не может запомнить свой пароль, но может запомнить хотя бы несколько символов.Я хочу, чтобы столбцы представляли каждую возможную альтернативу для каждого символа, тогда мой сценарий будет грубо форсировать пароль с ограничениями.Я уже кодировал уродливый сценарий, который делает то же самое, мне просто нужно перекодировать его для каждого пароля, я хочу сделать его динамичным, потому что он ДЕЙСТВИТЕЛЬНО пригодился.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Мне не сразу понятно, что ты пытаешься сделать. Самым близким к двумерному массиву, который есть в Python, является список списков. Теперь у вас есть один список, а не 2D-список. 2D-список будет выглядеть следующим образом (замените эти имена на более значимые):

list_of_lists = [[header0,  header1,  header2 ],
                 [r1c0data, r1c1data, r1c2data],
                 [r2c0data, r2c1data, r2c2data]]

Чтобы добавить строку, вы просто добавляете список (т.е. list_of_lists.append(new_list)). Чтобы добавить столбец, вам нужно добавить элемент в конец списка обучения следующим образом:

c4data = [header3, r1c3data, r2c3data]
for i, row in enumerate(list_of_lists):
    row.append(c4data[i])

Если вы действительно хотите 2D-массивы, вам лучше использовать numpy.array.

Но вы хотите индексировать отдельные строки по заголовкам столбцов? Если так, то вам лучше использовать список словарей:

list_of_dicts = [{'column0':r0c0data, 'column1':r0c1data, 'column2':r0c2data},
                 {'column0':r1c0data, 'column1':r1c1data, 'column2':r1c2data}]

Вы можете даже сократить это до одного диктанта, используя кортежи для адресации отдельных элементов:

tuple_key_dict = {(0, 0):r0c0data, (0, 1):r0c1data, (0, 2):r0c2data,
                  (0, 1):r0c1data, (1, 1):r1c1data, (1, 2):r1c2data}

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


Хорошо, чтобы делать то, что вы хотите, список списков вообще не нужен. Просто создайте список строк, каждая из которых представляет возможные символы в соответствующем индексе строки пароля. Например, скажем, пользователь использовал пароль, который представлял собой комбинацию немецких и английских слов для «appletree», но не может вспомнить, какую комбинацию:

>>> char_list = [''.join(set((a, b))) for a, b in zip('apfelbaum', 'appletree')]
>>> char_list
['a', 'p', 'pf', 'el', 'el', 'bt', 'ar', 'eu', 'em']

char_list теперь содержит все возможные буквы в каждом индексе. Чтобы сгенерировать все возможные пароли, все, что вам нужно, это декартово произведение этих строк:

>>> import itertools
>>> password_list = [''.join(tup) for tup in itertools.product(*char_list)]
>>> print 'appletree' in password_list
True
>>> print 'apfelbaum' in password_list
True
>>> print 'apfletrum' in password_list
True
2 голосов
/ 18 мая 2011

Если я правильно понимаю ваш вопрос.Посмотрите на это, чтобы увидеть, сработает ли оно для вас.

str_1 = 'Hey What\'s Up?'
str_2 = 'Hey, Not Much!'
my2dlist = [[str_1]] #Note the double brackets
my2dlist.append([str_2]) # Note that you are appending a List to the other list.
print my2dlist # Yields: [["Hey What's Up?"], ['Hey, Not Much!']]
my2dlist[0].append(-1)
print my2dlist # Yields: [["Hey What's Up?", -1], ['Hey, Not Much!']]

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

Ура!

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