给定一个包含多个名称作为参数的列表,我想知道是否有一种方法可以在第一个和最后一个分割名称,并创建一个包含所有名字和所有姓氏的二维列表。例如:
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
答案 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')]
然后使用zip
或map
来转置元组列表:
>>> 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']]