使用Python,如何只向列表中添加不同的消息?
认证Python Noob。请容忍我 在包含一百万(或更多)行文本的多个文件中,我将过滤掉不同的文本。也就是说,即使这数百万条代码中只包含15行不同的代码,代码也应该返回15行 从文件中读取该行,若该行不存在,则将其放入列表中,然后将该列表输出到另一个文件。听起来很简单 不过有一件小事: 我在寻找消息,而不是字符串/子字符串,或者你所拥有的东西。我将在下面解释 问题: 假设文件中有以下行:使用Python,如何只向列表中添加不同的消息?,python,regex,Python,Regex,认证Python Noob。请容忍我 在包含一百万(或更多)行文本的多个文件中,我将过滤掉不同的文本。也就是说,即使这数百万条代码中只包含15行不同的代码,代码也应该返回15行 从文件中读取该行,若该行不存在,则将其放入列表中,然后将该列表输出到另一个文件。听起来很简单 不过有一件小事: 我在寻找消息,而不是字符串/子字符串,或者你所拥有的东西。我将在下面解释 问题: 假设文件中有以下行: 随机2345 你好,世界 你的代码是91939 你的密码是54879 你的密码是79865 煎饼2451
- 随机2345
- 你好,世界
- 你的代码是91939
- 你的密码是54879
- 你的密码是79865
- 煎饼2451
- 您的验证码是123456
- 您的验证码是789101
,如果行在myList中不存在,则将行添加到myList
,这样仍然会返回重复的行。输出应为:
- 随机2345
- 你好,世界
- 你的代码是91939
- 煎饼2451
- 您的验证码是123456
- 嗨,我叫兰斯。很高兴认识你
- 嗨,我叫珍妮。很高兴认识你
- 哟,老兄。我叫约翰·埃里克。别碰我的薯条
- 哟,老兄。我叫詹姆斯。别碰我的薯条
- 我喜欢海龟
- Stefan对你的视频发表了评论
- n00bpwn3rz对您的视频发表了评论
- RJ想和你谈谈
- 珍妮喜欢你的照片
- Pi想和你谈谈
- Pi说请访问我的网站www.google.com
- 约翰·埃里克说,请访问我的网站www.johniscool.com
- 詹姆斯做水果冰块
- 嗨,我叫兰斯。很高兴认识你
- 哟,老兄。我叫约翰·埃里克。别碰我的薯条
- 我喜欢海龟
- Stefan对你的视频发表了评论
- RJ想和你谈谈
- 珍妮喜欢你的照片
- Pi说请访问我的网站www.google.com
- 詹姆斯做水果冰块
line_char[] = line #My Name is Jayson
list_char[] = list_item #My Name is Lance
if (list_char[] contains some sequence of line_char[]):
#My Name is Jayson = My Name is Lance (12 TRUE [My Name is ], 6 FALSE [Lance/Jayson]; 12 > 6)
line exists in list
else:
add line to list
还有其他想法吗?这可能更像是一个逻辑问题,但我想在Python中实现这一点,所以我只考虑它的优点和局限性
到目前为止的代码:
这里没什么可看的,伙计们
import os
in_path = "../aggregator/"
out_path = "../aggregator_output/"
# For server: for filename in os.listdir(in_path):
# For local: for filename in list_path:
list_path = os.listdir(in_path)
del list_path[0]
for filename in list_path:
in_base, in_ext = os.path.splitext(filename)
in_file = os.path.join(in_path, filename)
out_file = os.path.join(out_path, in_base + "_cleaned.csv")
print "Processing " + in_file
print "Writing to " + out_file
dirty_file = open(in_file, "rb").read().split("\n")
clean_file = open(out_file "wb")
list_unique = []
for line in dirty_file:
temp_line = re.sub('",', '^', line)
delimited = temp_line.split(",")
message = delimited[2]
到目前为止,我所有的代码都只是从文件(第3列)中筛选出正确的行
我真的很感激在这方面能得到一些帮助,因为这是一个相当有趣的问题,尽管我自己解决不了
谢谢
另外,注释掉了部分代码pre for loop是为了考虑到恼人的.DS在Mac上存储垃圾隐藏文件,这破坏了代码的其余部分。我在Mac上做测试,在ubuntu服务器上做实际的事情。从我看来,当存在可能的“重复”时,你只想保留第一行,而不关心数字或名称 为什么不:
- 看一行的第一个单词,如果你发现一个新的单词序列,你就把它添加到列表中
- 比较表示两行的两个字符串,并定义一个间隔,您知道这两行是不同的李>
- 嗨,我叫兰斯。很高兴认识你李>
- 嗨,我叫珍妮。很高兴认识你
class myString(str):
def __hash__(self):
count = 0
for c in self:
count += ord(c)
return count
a = myString('Hi, my name is Lance. Pleased to meet you.')
b = myString('Hi, my name is Jenny. Pleased to meet you.')
c = myString("Yo, dawg. Name's John Erik. Don't touch my fries.")
hash(a) = 3624
hash(b) = 3657
hash(c) = 4148
希望这会有帮助!请注意,对于具有相同字符序列的句子,此解决方案可能存在问题,例如:
hash(myString('abc')) = 294
hash(myString('bac')) = 294
据我所见,当有可能的“重复”时,您只想保留第一行,而不关心数字或名称 为什么不:
- 看一行的第一个单词,如果你发现一个新的单词序列,你就把它添加到列表中
- 比较表示两行的两个字符串,并定义一个间隔,您知道这两行是不同的李>
- 嗨,我叫兰斯。很高兴认识你李>
- 嗨,我叫珍妮。很高兴认识你
class myString(str):
def __hash__(self):
count = 0
for c in self:
count += ord(c)
return count
a = myString('Hi, my name is Lance. Pleased to meet you.')
b = myString('Hi, my name is Jenny. Pleased to meet you.')
c = myString("Yo, dawg. Name's John Erik. Don't touch my fries.")
hash(a) = 3624
hash(b) = 3657
hash(c) = 4148
希望这会有帮助!请注意,对于具有相同字符序列的句子,此解决方案可能存在问题,例如:
hash(myString('abc')) = 294
hash(myString('bac')) = 294
依我看,你只是想
a = """Hi, my name is Lance. Pleased to meet you.
Hi, my name is Jenny. Pleased to meet you.
Yo, dawg. Name's John Erik. Don't touch my fries.
Yo, dawg. Name's James. Don't touch my fries.
I like turtles 53669
Stefan commented on your video.
n00bpwn3rz commented on your video.
RJ wants to talk to you.
Jenny liked your photo.
Pi wants to talk to you.
Pi says visit my website at www.google.com
John Erik says visit my website at www.johniscool.com
James made fruity ice cubes."""
dirty_list = a.split('\n')
clean_list = [] # list of sets containing 'unique sets'
clean_list_pure = [] # list of the original sentences stored as sets in clean_list eg the output
for line in dirty_list:
line_set = set(line.strip().split(' '))
if all(len(line_set.intersection(clean_set)) < len(line_set)/2 for clean_set in clean_list):
clean_list.append(line_set)
clean_list_pure.append(line.strip())
for cl in clean_list_pure:
print cl