我在尝试转换列表时遇到问题。
原始列表如下:
[['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)
但是它不能按照我想要的方式工作。
答案 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]))])