如果第一个元素和最后一个元素相等,则为完整列表

时间:2019-05-09 14:19:05

标签: python list

我在尝试转换列表时遇到问题。

原始列表如下:

[['a','b','c',''],['c','e','f'],['c','g','h']]

现在我要这样输出:

[['a','b','c','e','f'],['a','b','c','g','h']]

找到空白('')后,将三个列表合并为两个列表。

我需要写一个函数来为我做这件事。

这是我尝试过的:

for x in mylist:

    if x[len(x) - 1] == '':

        m = x[len(x) - 2]
        for y in mylist:
            if y[0] == m:
                combine(x, y)


def combine(x, y):
    for m in y:
        if not m in x:
            x.append(m)
    return(x)

但是它不能按照我想要的方式工作。

5 个答案:

答案 0 :(得分:1)

尝试:

/* 1 */
{
    "GroupDetails" : [ ],
    "clgName" : "National"
},

/* 2 */
{
    "GroupDetails" : [
        {
            "members" : {
                "student" : [
                    "456"
                ]
            }
        },
        {
            "members" : {
                "student" : [
                    "123"
                ]
            }
        }
    ],
    "clgName" : "Anna University"
}

您的问题出在

mylist = [['a','b','c',''],['c','e','f'],['c','g','h']]


def combine(x, y):
    for m in y:
        if not m in x:
            x.append(m)
    return(x)

result = [] 

for x in mylist:

    if x[len(x) - 1] == '':

        m = x[len(x) - 2]
        for y in mylist:
            if y[0] == m:
                result.append(combine(x[0:len(x)-2], y))

print(result)

输出:

combine(x[0:len(x)-2], y)

答案 1 :(得分:0)

您的代码几乎可以工作,除了您永远不会对combine的结果做任何事情(将其打印或添加到某些结果列表中),并且不要删除{{ 1}}元素。但是,对于更长的列表,这可能会有点慢,因为它具有二次复杂度O(n²)。

相反,您可以使用字典将第一个元素映射到列表的其余元素。然后,您可以使用循环或列表理解功能将列表与正确的后缀组合在一起:

''

如果列表中可以包含多个占位符'',并且如果这些占位符可以出现在列表中间,则情况会变得更加复杂。您可以使它成为递归函数。 (通过使用索引而不是反复切片列表,可以提高效率。)

lst = [['a','b','c',''],['c','e','f'],['c','g','h']]

import collections
replacements = collections.defaultdict(list)
for first, *rest in lst:
    replacements[first].append(rest)

result = [l[:-2] + c for l in lst if l[-1] == "" for c in replacements[l[-2]]]
# [['a', 'b', 'c', 'e', 'f'], ['a', 'b', 'c', 'g', 'h']]

def replace(lst, last=None): if lst: first, *rest = lst if first == "": for repl in replacements[last]: yield from replace(repl + rest) else: for res in replace(rest, first): yield [first] + res else: yield [] for l in lst: for x in replace(l): print(x) 的输出:

lst = [['a','b','c','','b',''],['c','b','','e','f'],['c','g','b',''],['b','x','y']]

答案 2 :(得分:0)

所以您基本上想合并2个列表?如果是这样,您可以使用以下两种方法之一:

使用+运算符,或使用 extend()方法。

然后将其放入函数中。

答案 3 :(得分:0)

我只在注释中使用标准库。请参考。

mylist = [['a','b','c',''],['c','e','f'],['c','g','h']]

# I can't make sure whether the xlist's item is just one or not.
# So, I made it to find all
# And, you can see how to get the last value of a list as [-1]
xlist = [x for x in mylist if x[-1] == '']
ylist = [x for x in mylist if x[-1] != '']

result = []
# combine matrix of x x y
for x in xlist:
    for y in ylist:
        c = x + y # merge
        c = [i for i in c if i] # drop ''
        c = list(set(c)) # drop duplicates
        c.sort() # sort
        result.append(c)  # add to result

print (result)

结果是

[['a', 'b', 'c', 'e', 'f'], ['a', 'b', 'c', 'g', 'h']]

答案 4 :(得分:0)

尝试我的解决方案  尽管它会更改列表的顺序,但是它的代码很简单

lst = [['a', 'b', 'c', ''], ['c', 'e', 'f'], ['c', 'g', 'h']]
lst[0].pop(-1)
print([list(set(lst[0]+lst[1])), list(set(lst[0]+lst[2]))])