【问题标题】:nested linked list manipulation嵌套链表操作
【发布时间】:2020-12-28 19:46:05
【问题描述】:

我有一个列表,列表中的每一项也是一个列表

所有子列表都有2个元素,它们是链接在一起的,

[l1, l2, l3, l4...]

它们链接在一起的方式是l2[-1]等于l1[0]l3[-1]等于l2[0]l4[-1]=l3[0]等等。

所有子列表都有字符串元素,如'1 2 3'(由空格分隔的多个唯一数字)或'7'(只有一个数字)。

我想对以下列表进行转换

[['1 2 3', '4 5'], ['6 7', '1 2 3'], ['10', '6 7']]

输出将是

[[['1', '4'], ['6', '1'], ['10', '6']],
 [['2', '4'], ['6', '2'], ['10', '6']],
 [['3', '4'], ['6', '3'], ['10', '6']],
 [['1', '5'], ['6', '1'], ['10', '6']],
 [['2', '5'], ['6', '2'], ['10', '6']],
 [['3', '5'], ['6', '3'], ['10', '6']],
 [['1', '4'], ['7', '1'], ['10', '7']],
 [['2', '4'], ['7', '2'], ['10', '7']],
 [['3', '4'], ['7', '3'], ['10', '7']],
 [['1', '5'], ['7', '1'], ['10', '7']],
 [['2', '5'], ['7', '2'], ['10', '7']],
 [['3', '5'], ['7', '3'], ['10', '7']]]

在哪里

  • 最内层列表的元素是一个只包含一个数字的字符串。
  • 子列表也满足前面所述的属性。

我有一个线索,就像你必须通过每个点(示例中的六个点)并挑选一个数字,选择哪个数字取决于你之前选择的一对,我没有取得更多进展所以远。

【问题讨论】:

  • 请注意,这与普遍接受的“linked list”定义有所不同。

标签: python list algorithm


【解决方案1】:
import copy

lst = [['1 2 3', '4 5'], ['6 7', '1 2 3'], ['10', '6 7']]

def print_list(ls):
    if ls is not None:
        for x in ls:
            print x

def transform_list(l):

    if(len(l)==0):
        print 'list provided is empty'
        return None

    tr=[] # intermediate transformed list

    for b in l[0][-1].split(' '):

        for a in l[0][0].split(' '):

            tr = tr + [[[a,b]]]

    for i in range(1,len(l)):
    
        new_tr = []
        
        for a in l[i][0].split(' '):
            
            temp_tr=copy.deepcopy(tr)

            for t in range(len(temp_tr)):

                temp_tr[t].append( [a,temp_tr[t][-1][0]] )

            new_tr = new_tr + temp_tr

        tr=copy.deepcopy(new_tr)
            
    return tr


print '\n\nOutput:'
transformed_list = transform_list(lst)
print_list(transformed_list)

【讨论】:

    【解决方案2】:

    如果您不想生成所有组合然后选择“有效”组合,您可以先从列表中获取唯一值。 然后,您可以获取其中的itertools.product(在拆分字符串之后)并从中重建“链接”列表:

    lst = [['1 2 3', '4 5'], ['6 7', '1 2 3'], ['10', '6 7']]
    sub = [lst[0][1]] + [x[0] for x in lst] # ['4 5', '1 2 3', '6 7', '10']
    res =  [ [(b,a) for a,b in zip(p, p[1:])] for p in product(*map(str.split, sub))]
    

    我在这里使用元组而不是嵌套列表只是为了复杂列表理解的可读性,请随意将(...) 替换为更多[...]。结果:

    [[('1', '4'), ('6', '1'), ('10', '6')],
     [('1', '4'), ('7', '1'), ('10', '7')],
     [('2', '4'), ('6', '2'), ('10', '6')],
     [('2', '4'), ('7', '2'), ('10', '7')],
     [('3', '4'), ('6', '3'), ('10', '6')],
     [('3', '4'), ('7', '3'), ('10', '7')],
     [('1', '5'), ('6', '1'), ('10', '6')],
     [('1', '5'), ('7', '1'), ('10', '7')],
     [('2', '5'), ('6', '2'), ('10', '6')],
     [('2', '5'), ('7', '2'), ('10', '7')],
     [('3', '5'), ('6', '3'), ('10', '6')],
     [('3', '5'), ('7', '3'), ('10', '7')]]
    

    【讨论】:

    • 这是一个非凡的洞察力!
    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多