如何在列表中获取两个特定符号之间的项。

3

因此,我制作了一个类似于这样的示例列表:

dataList = ["tv", "•", "tv", "tv", "•", "tv", "•", "tv", "tv", "•"]

我愿意打印被包围的项目。
在这个例子中,
tv, tv
tv
tv, tv

我想到了以下代码:
num = 0
num2 = 0
index = 0
boolean = True

for index, elem in enumerate(dataList2):
    boolean = True
    num = index + 1,
    num = int(num[0])
    if elem == "•":
        counter = 0
        if boolean:
            boolean = False
            for elem2 in dataList2[num:]:
                counter = counter + 1,
                counter = int(counter[0])
                if elem2 == "•":
                    print("\n")
                    num2 = counter + num,
                    num2 = int(num2[0])
                    for el in dataList2[num:num2]:
                        print(el, end=" ")

我得到了以下输出:
tv tv • 

tv tv • tv • 

tv tv • tv • tv tv • 

tv • 

tv • tv tv • 

tv tv • 

正如您所看到的,我得到了不想要的行为

tv tv • tv •

tv tv • tv • tv tv •

tv • tv tv •

输出中包含在其中。我尝试使用布尔值修复行为,但没有成功。我做错了什么?


1
如果您使用while循环,您的方法可能会更简单。 - Albin Paul
啊,我明白了,没想到要这么做,非常感谢你。 - Nikita
4个回答

2

一种可能的方法是找到特殊字符的索引,并将列表分成第一个和最后一个出现之间的块:

indices = [i for i, v in enumerate(dataList) if v == "•"]
result = [dataList[indices[i - 1] + 1:indices[i]] for i in range(1, len(indices))]

对于您的输入,您将获得

>>> result
[['tv', 'tv'], ['tv'], ['tv', 'tv']]

现在您可以使用该值打印并执行其他操作。例如:
>>> for s in result:
...     print(*s, sep=', ')
tv, tv
tv
tv, tv

如果您计划将中间结果用于其他用途,那么计算中间结果总是比仅打印它们更好。


1
也许 [dataList[i+1:j] for i,j in zip(indices, indices[1:])] 更符合个人风格选择。 - Michael Szczesny
2
@MichaelSzczesny。我很高兴你在评论中指出了这一点。通常我发现我的方法更可取,因为索引更明确,而且为indixes[1:]分配额外的列表会让我感到不爽。尽管如此,我会第一个承认你的建议看起来更漂亮,所以我很高兴你把它作为另一种选择发布了出来。 - Mad Physicist
不过还有一种更加简便的方式,从 Python 3.10 开始就有itertools.pairwise()了。如果我们将 indexes 转换成生成器并调用一次 next(),那么它应该是一个具有 O(n) 复杂度的好选择 *(我没有检查 C 实现,所以不能确定最后一个语句,但它看起来是合法的)*。 - Olvin Roght
@OlvinRoght。你可以一开始就使用itertools.tee - Mad Physicist
@MadPhysicist,但是pairwise()是在C级别上实现的,实际上它是一个带有前一个元素缓冲区的迭代器。来源 - Olvin Roght
显示剩余2条评论

1

请尝试以下方法:

data = ["tv", "•", "tv", "tv", "•", "tv", "•", "tv", "tv", "•"]
temp = []
counter = 0
for d in data:
  if d == "•":
    if counter == 1:
      print(','.join(temp))
      temp = []
      counter = 1
    else:
      counter += 1
  else:
    if counter != 0:
      temp.append(d)
if temp:
  print(','.join(temp))
  

输出

tv,tv
tv
tv,tv

1
只是迭代解决方案的稍微简短一些的版本。
dataList = ["tv", "•", "tv", "tv", "•", "tv", "•", "tv", "tv", "•"]

sub = ['tv']
for i in dataList:
    if i == '•':
        if sub[0] == '•':
            print(*sub[1:], sep=', ')
        sub = []
    sub += [i]

输出

tv, tv
tv
tv, tv

1
dataList = ["tv", "•", "tv", "tv", "•", "tv", "•", "tv", "tv", "•"]
searchFor = "•"
allVals = []
isFound = False
oldIdx = -1
for idx, item in enumerate(dataList):
    if item == searchFor:
        if isFound:
            # loop complete
            allVals.append(dataList[oldIdx + 1 : idx ])
            isFound = False
        else:
            isFound = True
            oldIdx = idx


allVals
[['tv', 'tv'], ['tv', 'tv']]

allStrings = [",".join(x) for x in allVals]

allStrings
['tv,tv', 'tv,tv']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接