根据另一个列表的元素更改一个列表中的元素

时间:2020-04-07 03:13:41

标签: python

我有两个清单。第一个列表是代表句子的单词列表:

x = ['i', 'can', 'tell', 'you', 'about', 'the', 'keynote.', 'help', 'you', 'browse', 'sessions.', 'or', 'recommend', 'specific', 'office', 'hours', 'and', 'app', 'reviews.', 'which', 'would', 'you', 'like?']

第二个列表的长度与第一个列表相同,并且由数字(0、1、2、3或4)组成:

y = ['0', '2', '2', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '3', '0', '0']

我需要针对第一列表中的标点符号将第一列表和第二列表分开。它看起来像:

x1 = ['i', 'can', 'tell', 'you', 'about', 'the', 'keynote.']
y1 = ['0', '2', '2', '0', '0', '0', '0']

x2 = ['help', 'you', 'browse', 'sessions.']
y2 = ['0', '0', '0', '0']

x3 = ['or', 'recommend', 'specific', 'office', 'hours', 'and', 'app', 'reviews.']
y3 = ['1', '1', '1', '0', '0', '0', '0', '0']

x4 = ['which', 'would', 'you', 'like?']
x5 = ['0', '3', '0', '0']

从这些列表中,我需要创建两个列表。在新的第一个列表中,元素将是句子,而在第二个新列表中,元素将是数字。如果具有数字的列表具有除0以外的任何数字,则将其放入第二个新列表中的数字,否则置于零。它看起来像:

x_new = ["i can tell you about the keynote.", "help you browse sessions.", "or recommend specific office hours and app reviews.", "which would you like?"]
y_new = [2, 0, 1, 3]

注意:如果带有数字(例如 y1 )的列表具有多个不同的数字(例如 ['0','2','2','1',' 1','1','0'] ,然后采用具有更多并发性的数字(在此示例中为'1')。如果数字的并发性相同( ['0','2','2','1','1','0','0'] )取列表中的第一个非零数字(在此示例中为'2')。

这是我的代码:

x = ['i', 'can', 'tell', 'you', 'about', 'the', 'keynote.', 'help', 'you', 'browse', 'sessions.', 'or', 'recommend', 'specific', 'office', 'hours', 'and', 'app', 'reviews.', 'which', 'would', 'you', 'like?']
y = ['0', '2', '2', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '3', '0', '0']
x_new = []
y_new = []
i = 0
k = 0
punctuation_marks = ('.', '?', '!')

# searching punctuation marks
while i < len(x):
    for k in range(i, len(x)):
        # if a punctuation mark has found
        if x[k].endswith(punctuation_marks):
            # create list's element for a sentence 
            x_new += x[i:k]
            # cheaking for promises before the punctuation mark
            for l in range(i, k):
                if y[l] == '1':
                    y_new += '1'
                    break
                else:
                    y += '0'
                    break                 
        break
    i = k

但是它进入了无限循环,我无法弄清楚它出了什么问题。另外,我不知道如何计算脚本中数字并发的数量(请参见上面的注释)。我的代码只是在数字列表中找到第一个元素。

1 个答案:

答案 0 :(得分:0)

如果您检查起点,那么您的代码将更加高效。

尝试此代码。

x = ['i', 'can', 'tell', 'you', 'about', 'the', 'keynote.', 'help', 'you', 'browse', 'sessions.', 'or', 'recommend', 'specific', 'office', 'hours', 'and', 'app', 'reviews.', 'which', 'would', 'you', 'like?']
y = ['0', '2', '2', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0', '0', '3', '0', '0']
x_new = []
y_new = []
punctuation_marks = ('.', '?', '!')

s = 0
for i in range(len(x)):
    if x[i].endswith(punctuation_marks):
        x_new.append(' '.join(x[s:i+1]))
        y_new.append(max(list(map(int, y[s:i+1]))))
        s = i + 1