将特定列添加到单行列表(可能有点基础)

1 投票
2 回答
4314 浏览
提问于 2025-04-16 17:50

我正在设计一个密码恢复程序,想要让它足够“正确”和模块化,以便可以插入到其他程序中,所以我想避免一些笨拙的解决方案。

简单来说,我有一个包含字符串的列表:

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

现在我有一个二维列表,里面只有一行。我想做的就是在用户指定的索引下添加列(这些列本身也可以是列表)。

比如说,可能有3个索引(对应于一列),像是:0, 4, 6(H, w, a),现在我只想动态地在这些列下添加任何东西。我搜索了一下,但没有找到太多有用的信息(我看到有一些提到使用字典(Dict)数据类型可能更好的帖子),我感觉完全卡住了……

补充说明:

基本上,第一行将代表用户想要恢复的密码。假设用户记不住他们的密码,但至少能记住几个字符。我想让这些列代表每个字符的所有可能替代选项,然后我的脚本会根据这些限制来暴力破解密码。我之前写了一个很笨的脚本来做同样的事情,但每次都得为每个密码重新编码,我想让它变得动态,因为这真的很有用。

谢谢!

2 个回答

2

如果我理解你的问题没错的话,可以看看这个,看看它是否适合你。

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类型来关联。如果你需要更多的解释,告诉我,我可以详细讲讲。

祝好!

2

我不太明白你想要做什么。Python中最接近二维数组的东西是“列表的列表”。不过你现在的只是一个单一的列表,而不是一个二维列表。一个二维列表应该是这样的(把这些名字换成更有意义的):

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])

如果你真的想要二维数组,使用 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

撰写回答