Extend/append python 加入列表
Extend/append python join list
我有一个例子:
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
a = 0
b = []
c = []
count = []
for x in range(len(li)):
for a in range(len(li[x])):
if li[x][a].isalpha():
a += 1
elif not li[x][a].isalpha() and li[x][a + 1].isalpha():
a += 1
else:
break
i = (len(li[x]) - a)
b.extend([' '.join(li[x][0:a])])
b.extend(li[x][a::])
count.append(i)
for x in range(len(count)):
a = count[x] + 1
z = (sum(count[:x]))
if x == 0:
c.append(b[:a])
else:
c.append(b[a+1::z])
print(c)
我在 li
列表中有多个项目,列表本身的长度不是固定的。
如果数组中的任何元素是一个字符串,或者如果两个字符串之间有其他符号,它会将所有内容组合到一个元素中 - 这个连接按我想要的方式工作。
我想保留现有结构。例如,输出现在看起来像这样:
[['b b c 3.2 text', '3', '5', '5'], ['a w', 'a x', 'a b', '4'], ['a w', '4'], ['5', '4'], ['a w', '']]
但它应该是这样的:
[['b b c 3.2 text', '3', '5', '5'],['aw','3','4'],['ax','3','4'],['ab'],['312','4']
当然,我发送的代码不能正常工作 - 我想到了一个解决方案,但我仍然有一些问题 - 我不知道如何向这个列表添加范围 c
- 我试试将列表元素的长度拉为 count
但它对我也不起作用 - 也许这是一个糟糕的解决方案?也许这个 extend b
不是最好的解决方案?也许使用这么多 'transformations' 并创建新列表没有意义?
给我一些提示。
这个定义对我来说有点不清楚,但我想这样就可以了。不过,代码不是很冗长。如果它如您所愿,我可以尝试解释/使其更简单。
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
def join_to_last_text(lst: list, min_join: int = 1) -> list:
last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=min_join - 1)
return [' '.join(lst[:last_text + 1])] + lst[last_text + 1:]
output = [join_to_last_text(lst) for lst in li]
print(output)
# You can join a minimum of first items by setting a higher max default.
# If max does not find isalpha, it will use this value.
output_min_2 = [join_to_last_text(lst, min_join=2) for lst in li]
print(output_min_2)
@Johan Schiff 的代码按预期工作但留下了一个极端情况——当列表的第一个元素不是文本时。我对他的代码做了一点小改动来处理这种情况:
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
def join_to_last_text(lst: list) -> list:
first_text = min((i for i,s in enumerate(lst) if s.isalpha()), default=0)
last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=0)
return lst[:first_text] + [''.join(lst[first_text:last_text + 1])] + lst[last_text + 1:]
output = [join_to_last_text(lst) for lst in li]
print(output)
这会在哪里给出不同的输出(正确的输出)?查看以下测试用例:
li = [['4','b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4']]
@Johan 的代码会输出 -
[['5bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]
而基于问题中的以下短语
If any element in the array is a string or if there is some other symbol between the two strings, it combines everything into one element
输出应该是-
[['5', 'bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]
我有一个例子:
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
a = 0
b = []
c = []
count = []
for x in range(len(li)):
for a in range(len(li[x])):
if li[x][a].isalpha():
a += 1
elif not li[x][a].isalpha() and li[x][a + 1].isalpha():
a += 1
else:
break
i = (len(li[x]) - a)
b.extend([' '.join(li[x][0:a])])
b.extend(li[x][a::])
count.append(i)
for x in range(len(count)):
a = count[x] + 1
z = (sum(count[:x]))
if x == 0:
c.append(b[:a])
else:
c.append(b[a+1::z])
print(c)
我在 li
列表中有多个项目,列表本身的长度不是固定的。
如果数组中的任何元素是一个字符串,或者如果两个字符串之间有其他符号,它会将所有内容组合到一个元素中 - 这个连接按我想要的方式工作。
我想保留现有结构。例如,输出现在看起来像这样:
[['b b c 3.2 text', '3', '5', '5'], ['a w', 'a x', 'a b', '4'], ['a w', '4'], ['5', '4'], ['a w', '']]
但它应该是这样的:
[['b b c 3.2 text', '3', '5', '5'],['aw','3','4'],['ax','3','4'],['ab'],['312','4']
当然,我发送的代码不能正常工作 - 我想到了一个解决方案,但我仍然有一些问题 - 我不知道如何向这个列表添加范围 c
- 我试试将列表元素的长度拉为 count
但它对我也不起作用 - 也许这是一个糟糕的解决方案?也许这个 extend b
不是最好的解决方案?也许使用这么多 'transformations' 并创建新列表没有意义?
给我一些提示。
这个定义对我来说有点不清楚,但我想这样就可以了。不过,代码不是很冗长。如果它如您所愿,我可以尝试解释/使其更简单。
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
def join_to_last_text(lst: list, min_join: int = 1) -> list:
last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=min_join - 1)
return [' '.join(lst[:last_text + 1])] + lst[last_text + 1:]
output = [join_to_last_text(lst) for lst in li]
print(output)
# You can join a minimum of first items by setting a higher max default.
# If max does not find isalpha, it will use this value.
output_min_2 = [join_to_last_text(lst, min_join=2) for lst in li]
print(output_min_2)
@Johan Schiff 的代码按预期工作但留下了一个极端情况——当列表的第一个元素不是文本时。我对他的代码做了一点小改动来处理这种情况:
li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]
def join_to_last_text(lst: list) -> list:
first_text = min((i for i,s in enumerate(lst) if s.isalpha()), default=0)
last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=0)
return lst[:first_text] + [''.join(lst[first_text:last_text + 1])] + lst[last_text + 1:]
output = [join_to_last_text(lst) for lst in li]
print(output)
这会在哪里给出不同的输出(正确的输出)?查看以下测试用例:
li = [['4','b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4']]
@Johan 的代码会输出 -
[['5bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]
而基于问题中的以下短语
If any element in the array is a string or if there is some other symbol between the two strings, it combines everything into one element
输出应该是-
[['5', 'bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]