【问题标题】:Add specific columns to a single row list (might be a little basic)将特定列添加到单行列表(可能有点基础)
【发布时间】:2011-05-17 21:48:02
【问题描述】:

我正在设计一个密码恢复程序,我想让它“正确”/模块化以插入其他程序,所以我试图避免丑陋的黑客攻击。

这是概要:我有一个带有字符串的列表

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

现在我有一个单行的二维列表。我要做的就是在用户指定的索引下添加列(可能是列表本身)

所以,可能有 3 个索引(对应于一列) 比如:0,4,6(H,w,a) 现在我只想动态地将任何内容附加到这些列。我已经进行了搜索,但没有多大帮助(我确实看到了一些很有前途的帖子,提到在这里使用 Dict 数据类型可能会更好),我觉得完全被困住了......

编辑/澄清:

基本上,第一行将代表用户想要恢复的密码。假设用户不记得他们的密码,但至少可以记住几个字符。我希望这些列代表每个字符的每个可能的替代方案,然后我的脚本将强制使用约束的密码。我已经编写了一个丑陋的脚本来做同样的事情,我只需要为每个密码重新编码,我想让它动态,因为它真的派上用场了。

谢谢!

【问题讨论】:

    标签: python list 2d append


    【解决方案1】:

    我并不清楚您要做什么。 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])
    

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

    【讨论】:

    • (+1) 这是我在回答中提到的更多细节。
    • 我将它编辑到我的帖子中,但这是另一个副本:基本上,第一行将代表用户想要恢复的密码。假设用户不记得他们的密码,但至少可以记住几个字符。我希望这些列代表每个字符的每个可能的替代方案,然后我的脚本将强制使用约束的密码。我已经编写了一个丑陋的脚本来做同样的事情,我只需要为每个新密码重新编码,我想让它动态化,因为它真的派上用场了,其他人也可以使用它。
    • @Dave,我的建议见上文。
    • 非常感谢您的全面帖子,列表列表对我来说有点脑筋急转弯。
    • 天哪,那个拉链功能正是医生要求的! =D
    【解决方案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 类型。如果您需要更多解释,请告诉我,我可以更详细地说明。

    干杯!

    【讨论】:

    • 声明 my2dlist[0].append(-1) 正是我“确实”想要的,但是,senderle 采用了完全不同的方法,效果同样好。虽然你也教会了我一些新东西,我很感激,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2012-01-22
    • 2016-10-20
    相关资源
    最近更新 更多