说我有一个2D数组:
array = [['abc',2,3,],
['abc',2,3],
['bb',5,5],
['bb',4,6],
['sa',3,5],
['tt',2,1]]
我想删除第一列重复的任何行 即比较数组[0]并仅返回:
removeDups = [['sa',3,5],
['tt',2,1]]
我认为应该是这样的: (将first col设置为tmp变量,将tmp与剩余和比较返回的#set数组进行比较)
for x in range(len(array)):
tmpCol = array[x][0]
del array[x]
removed = compare(array, tmpCol)
array = copy.deepcopy(removed)
print repr(len(removed)) #testing
比较是: (将每个剩余数组项的第一个col与tmp进行比较,如果匹配则删除else返回原始数组)
def compare(valid, tmpCol):
for x in range(len(valid)):
if valid[x][0] != tmpCol:
del valid[x]
return valid
else:
return valid
我一直在超出范围'错误。我已尝试过其他方法,但我真的很感激一些帮助!
答案 0 :(得分:1)
您可以尝试的一个选项是先预先为数组的第一列创建一个计数器,然后根据计数值过滤列表,即仅在第一个元素只出现一次时保留该元素:
from collections import Counter
count = Counter(a[0] for a in array)
[a for a in array if count[a[0]] == 1]
# [['sa', 3, 5], ['tt', 2, 1]]
答案 1 :(得分:0)
您可以使用字典并计算每个键的出现次数。
您还可以使用实际执行此操作的库集合中的Counter
。
请执行以下操作:
from collection import Counter
removed = []
for k, val1, val2 in array:
if Counter([k for k, _, _ in array])[k]==1:
removed.append([k, val1, val2])
答案 2 :(得分:0)
与其他答案类似,但使用字典而不是导入计数器:
String input = master_string;
Hashtable<String, int[]> result = new Hashtable<String, int[]>();
Pattern pattern = Pattern.compile("([A-Z]+):(\\d+(?:,\\d+)*)");
Matcher matcher = pattern.matcher(input);
while (matcher.find())
{
String key = matcher.group(1);
String[] fields = matcher.group(2).split(",");
int[] values = new int[fields.length];
for (int pqr=0; pqr<values.length; pqr++)
{
values[pqr] = Integer.parseInt(fields[pqr]);
// values[pqr] = fields[pqr];
}
result.put(key, values);
}