我基本上有两个相关的问题。
首先,我有下面的数据集。
['Dividingpolynomials', 'Categoricaldataandprobabilities', 'Systemsoflinearequations', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Dividingpolynomials', 'Dividingpolynomials', 'Categoricaldataandprobabilities', 'Dividingpolynomials', 'Scatterplotsandgraphs', 'Scatterplotsandgraphs', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Scatterplotsandgraphs', 'Dividingpolynomials', 'Dividingpolynomials', 'Dividingpolynomials', 'Manipulatingpolynomials', 'Dividingpolynomials', 'Scatterplotsandgraphs']我想知道如何编辑数组以更好地格式化它。
期望的结果类似于["Dividing Polynomials", "Categorical Data and Probabilities", "Systems of Linear Equations", "Scatterplots and Graphs", "Manipulating Polynomials"]。
这是在Python中实现的,结果也应该是一个数组。
第二个问题要简单得多:
对于不同的节,我的代码格式化了一个不同的数据集,它工作得很好。
唯一的问题是And是大写的,我似乎不能修改它来使和小写。
代码已经写好了,只需要稍作调整即可。
temptopiclist = [re.sub(r"and([A-Z])", r"And\1", element) for element in temptopiclist]
topiclist = [re.sub(r"(\w)([A-Z])", r"\1 \2", element).title() for element in temptopiclist]
print(topiclist, "<br>", "<br>")需要修复的结果数据集:
['Advanced Algebra', 'Problem Solving And Data Analysis', 'Basic Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Problem Solving And Data Analysis', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Problem Solving And Data Analysis', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Advanced Algebra', 'Problem Solving And Data Analysis']发布于 2020-07-14 22:56:33
对于您的第二个问题,您可以像前面提到的那样进行搜索和替换:
text.replace(" And ", " and ")至于你的第一个问题,正如Klaus在评论中正确地提到的那样,putting words together is trivial, dividing them is very hard.
然而,解决困难的问题很有趣。
解决这个问题的一种方法是使用递归和dynamic programming。
请注意,您将需要访问常用英语单词的字典。
如果您知道数据集中存在的所有单词,则可以在words_dict列表中输入它们。
否则,您将需要在英语词典中获得一个公开可用的单词列表。
trie代码可以从here获得。
from collections import deque
from trie import Trie
def partition_valid_words(start_pos, end_pos, trie, input_phrase, cache):
pos_pair = (start_pos, end_pos)
if pos_pair in cache:
return cache[pos_pair]
if start_pos > end_pos:
dq = deque()
dq.append(None)
cache[pos_pair] = dq
return cache[pos_pair]
if start_pos == end_pos:
if trie.search(input_phrase[start_pos]) == 1:
dq = deque()
dq.append((start_pos, start_pos))
cache[pos_pair] = dq
return cache[pos_pair]
cache[pos_pair] = None
return cache[pos_pair]
for break_pos in range(start_pos, end_pos + 1):
phrase_substring = input_phrase[start_pos : break_pos + 1]
search_result = trie.search(phrase_substring)
if search_result == 0:
break
if search_result == 2:
continue
sub_ans_dq = partition_valid_words(break_pos + 1, end_pos, trie, input_phrase, cache)
if sub_ans_dq is None:
continue
sub_ans_dq.appendleft((start_pos, break_pos))
cache[pos_pair] = sub_ans_dq
return cache[pos_pair]
cache[pos_pair] = None
return cache[pos_pair]
def add_spaces(dq, input_phrase):
if dq is None:
return None
sentence = []
for elem in dq:
if elem is None or len(elem) < 2:
continue
word = input_phrase[elem[0]: elem[1]+1]
sentence.append(word)
return sentence
def main():
input_phrase = "categoricaldataandprobabilities"
words_dict = ['categorical', 'data', 'and', 'probabilities']
trie = Trie()
for word in words_dict:
trie.insert(word)
ans = partition_valid_words(0, len(input_phrase) - 1, trie, input_phrase, {})
ans = ' '.join(add_spaces(ans, input_phrase))
print(ans)
main()你需要注意大小写。
在数据集中,第一个字母是大写的。
由于我们在递归算法中执行区分大小写的匹配,因此必须首先使所有数据集完全小写。
您可以将结果数据集的第一个字母再次转换为大写字母。
https://stackoverflow.com/questions/62630434
复制相似问题