我需要填充Python数据结构,无论是列表还是字典或类似的,每个条目都有多个值,但如果重复某些值,我需要跳过该条目。
例如,假设我有三行文本,每行有三个值,两行具有相同的第一个值:
AAA XXX 132
AAA YYY 465
BBB ZZZ 798
我想得到的结果是两个条目的数组或字典,每个条目都有三个值,这样我以后可以迭代它并获得我需要的每个值。
目前我有一个这样的例子:
teststring = 'AAA XXX 132\nAAA YYY 465\nBBB ZZZ 798'
a = []
count = 0
for line in teststring.splitlines():
val1 = line[0:3]
val2 = line[4:7]
val3 = line[8:11]
count = count + 1
d = {'val1':val1, 'val2':val2, 'val3':val3}
a.append(d)
for i in a:
print i['val1'] + ' ' + i['val2'] + ' ' + i['val3']
(打印只是一个例子,变量“a”将被传递给另一个在那里进一步操作的函数,所以如果字典中的值具有有意义的“名称”,我会非常感激,例如i['some_value']
而不是i[1]
{1}})
但不仅仅是a.append(d)
我需要跳过第二条AAA
行,例如
if d.['val1'] not in a:
a.append(d)
我很确定解决方案,如果简单,我无法找到它,请帮助。
这是我在检查flyingmeatball的消化之后的做法:
teststring = 'AAA XXX 132\nAAA YYY 465\nBBB ZZZ 798'
a = {}
for line in teststring.splitlines():
val1 = line[0:3]
val2 = line[4:7]
val3 = line[8:11]
if val1 not in a.keys():
d = {'val1':val1, 'val2':val2, 'val3':val3}
a[val1] = d
for i in a.values():
print i['val1'] + ' ' + i['val2'] + ' ' + i['val3']
如果需要,我可以这样排序:
aa = a.values()
aa.sort(key = lambda dict: dict['val1'])
for i in aa:
print i['val1'] + ' ' + i['val2'] + ' ' + i['val3']
但我不确定这是否是最佳解决方案......
答案 0 :(得分:1)
您可以从Python 2.7开始使用字典理解。我使用reversed
来确保您保留数据中的第一个条目,而不是最后一个条目
data ={x.split()[0]:x.split() for x in reversed(teststring.split('\n'))}
for value in data.values();
print value[0] + ' ' + value[1] + ' ' + value[2]
输出:
AAA XXX 132
BBB ZZZ 798
更详细地解释词典理解,下面的一些逻辑通过回车分割您的输入字符串并反转列表(我稍后会再回过头来):
reversed(teststring.split('\n'))
下一位逻辑在使用结果数组的第一个值作为字典键将值除以空格后创建一个字典条目:
x.split()[0]:x.split()
如果存在具有相同键的元素,则将覆盖字典值,因此需要使用reversed
答案 1 :(得分:1)
我认为你想要的只是一个词典,如果它还不存在你只能把它读入词典?
teststring = 'AAA XXX 132\nAAA YYY 465\nBBB ZZZ 798'
outputDict = {}
for line in teststring.splitlines():
val1 = line[0:3]
val2 = line[4:7]
val3 = line[8:11]
if val1 not in outputDict:
outputDict[val1] = [val2,val3]
答案 2 :(得分:1)
根据您的目标执行此操作的一种方法是在单独的容器中处理值以检查是否已插入。
teststring = 'AAA XXX 132\nAAA YYY 465\nBBB ZZZ 798'
a = []
val1_set = set()
count = 0
for line in teststring.splitlines():
val1 = line[0:3]
val2 = line[4:7]
val3 = line[8:11]
count = count + 1
d = {'val1':val1, 'val2':val2, 'val3':val3}
if val1 not in val1_set:
a.append(d)
val1_set.add(val1)
答案 3 :(得分:1)
我对你想要达到的目标感到有些困惑,但这是我的尝试:
teststring = 'AAA XXX 132\nAAA YYY 465\nBBB ZZZ 798'
a = []
count = 0
for line in teststring.splitlines():
val1 = line[0:3]
val2 = line[4:7]
val3 = line[8:11]
count = count + 1
d = {'val1':val1, 'val2':val2, 'val3':val3}
found = False
for i in a:
if i['val1'] == d['val1']:
found = True
if not found:
a.append(d)
for i in a:
print(i['val1'] + ' ' + i['val2'] + ' ' + i['val3'])
这会产生:
AAA XXX 132
BBB ZZZ 798
如果你想检查'val1'是否存在任何可能的3个值,那么你开始计算AAA BBB XXX和BBB CCC YYY作为重复项(BBB出现两次),然后你可以按如下方式修改它:< / p>
if i['val1'] == d['val1'] or i['val2'] == d['val1'] or i['val3'] == d['val1']: