将列表拆分为二维列表

时间:2015-03-20 16:00:54

标签: python list

给定一个包含多个名称作为参数的列表,我想知道是否有一种方法可以在第一个和最后一个分割名称,并创建一个包含所有名字和所有姓氏的二维列表。例如:

lst=(["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"])

输出应为:

[["Leonoardo","Brad","Angelina"],["DiCaprio","Pitt","Jolie"]]

我知道我需要迭代给定列表,并将名字和姓氏附加到新列表中,但我不太清楚如何去做。 这是我到目前为止所得到的:

fname=[]
lname=[]
for i in nlst:
    i.split()
fname.append(i[0])
lname.append(i[1])  
return lname,fname

7 个答案:

答案 0 :(得分:0)

您可以使用简单的列表理解:

>>> lst=(["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"])
>>> new = [[item.split(',')[1] for item in lst], [item.split(',')[0] for item in lst]]
>>> new
[['Leonardo', ' Brad', ' Angelina'], ['DiCaprio', 'Pitt', 'Jolie']]

或者你可以zip

>>> x = [item.split(',') for item in lst]
>>> list(reversed(zip(*x)))
[('Leonardo', ' Brad', ' Angelina'), ('DiCaprio', 'Pitt', 'Jolie')]       

答案 1 :(得分:0)

您可以拆分和转置:

lst = ["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"]

print([list(ele) for ele in zip(*(ele.split(",") for ele in lst))])

或使用地图:

print(list(map(list, zip(*(ele.split(",") for ele in lst)))))

[['DiCaprio', 'Pitt', 'Jolie'], ['Leonardo', ' Brad', ' Angelina']]

如果您需要逆转订单:

print(list(map(list, zip(*(reversed(ele.split(",")) for ele in lst)))))

[['Leonardo', ' Brad', ' Angelina'], ['DiCaprio', 'Pitt', 'Jolie']]

对于python2,您可以使用izip并删除地图上的列表调用:

from itertools import izip
print(map(list, izip(*(reversed(ele.split(",")) for ele in lst))))

答案 2 :(得分:0)

这可能会对您有所帮助:

list_names = []
list_last =[]
lst=["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"]
for element in lst:

   list_names.append(element.split(',')[0])
   list_last.append(element.split(',')[1])

如果您还有其他需要,请告诉我

答案 3 :(得分:0)

您可以使用zip功能:

>>> l=["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"]
>>> zip(*[i.split(',') for i in l])[::-1]
[('Leonardo', ' Brad', ' Angelina'), ('DiCaprio', 'Pitt', 'Jolie')]

如果您希望将结果作为列表,则可以使用map函数转换为列表:

>>> map(list,zip(*[i.split(',') for i in l])[::-1])
[['Leonardo', ' Brad', ' Angelina'], ['DiCaprio', 'Pitt', 'Jolie']]

答案 4 :(得分:0)

分割后返回名称的函数。

def split_list(the_list=["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"]):
    list_2d = [[],[]]
    for full_name in the_list:
        first_name, second_name = full_name.split(',')
        list_2d[0].append(first_name)
        list_2d[1].append(second_name)
    return list_2d

print split_list()

答案 5 :(得分:0)

根据您的代码,您可以尝试:

lst=(["DiCaprio,Leonardo","Pitt, Brad", "Jolie, Angelina"])
fname=[]
lname=[]
for i in lst:
   fname.append(i.split(",")[0])
   lname.append(i.split(",")[1])  

print [lname,fname]

答案 6 :(得分:-1)

您可以使用正则表达式:

>>> re.findall(r'(\w+),\s*(\w+);?', ';'.join(lst)) 
[('DiCaprio', 'Leonardo'), ('Pitt', 'Brad'), ('Jolie', 'Angelina')]

然后使用zipmap来转置元组列表:

>>> map(None, *re.findall(r'(\w+),\s*(\w+);?', ';'.join(lst))) 
[('DiCaprio', 'Pitt', 'Jolie'), ('Leonardo', 'Brad', 'Angelina')]

在Python 3上,你不能以这种方式使用地图。相反,你会这样做:

>>> list(map(lambda *x: [e for e in x], *re.findall(r'(\w+),\s*(\w+);?', ';'.join(lst))))

如果您愿意,请反转订单并列出清单而不是元组列表:

>>> lot=map(None, *re.findall(r'(\w+),\s*(\w+);?', ';'.join(lst)))
>>> [list(lot[1]), list(lot[0])]
[['Leonardo', 'Brad', 'Angelina'], ['DiCaprio', 'Pitt', 'Jolie']]